iOS7之后,关于NavigationBar存在时,UIScrollView内容发生偏移的问题

来源:互联网 发布:美国丽人 知乎 编辑:程序博客网 时间:2024/05/16 07:45

⭐️最近才遇到的坑,我很纳闷之前为毛没发现:
在使用NavigationBar的ViewController中,navigationbar的下方,添加了一个UIScrollView,类似于网易新闻,实现内容左右滑动,但是发现scrollView中的内容偏移了,不管怎么设置frame,scrollView中的滚动内容总是偏移的!!!

⭐️后来想起来在iOS7之后,苹果做的牛(S)逼(B)调整,如果ViewController上有navigationbar,自动将view上的内容下移64,且如果是透明的,self.navigationController.navigationBar.translucent = YES(默认),那么ViewController的View的frame是从(0,0,width,height)开始的,所以被navigationbar覆盖一部分,但是view上的内容已经下移,这种情况下,scrollView的point设置(0,0)就被覆盖,设置(0,64),则scrollView上的内容就偏移128了。。。

⭐️iOS7以上系统,self.navigationController.navigationBar.translucent默认为YES,self.view.frame.origin.y从0开始(屏幕最上部)。
此时若是添加代码self.edgesForExtendedLayout = UIRectEdgeNone(iOS7.0以后方法);self.view.frame.origin.y会下移64像素至navBar下方开始。但是此时当push到一个新的controller之前给当前屏幕截图的时候[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];,由于navBar是透明的,会出现64像素的黑色区域。此时只需要把self.navigationController.navigationBar.translucent=NO即可,不需要加代码self.edgesForExtendedLayout;

⭐️iOS7之后也增加了一个self.tabBarController.tabBar.translucent的属性,默认为YES。当应用同时使用navBar和TabBar的时候。设置self.tabBarController.tabBar.translucent=NO并且self.navigationController.navigationBar.translucent=NO时候,得到self.view.frame—>{{0, 64}, {320, 455}}。视图的高度也改变为navBar和tabBar之间的455像素。当self.navigationController.navigationBar.translucent=YES并且self.tabBarController.tabBar.translucent=NO的时候self.view.frame—>{{0, 0}, {320, 519}};其都为YES的时候self.view.frame—>{{0, 0}, {320, 568}};

⭐️其实解决方法不少:
1、将自动下移调整关掉:self.automaticallyAdjustsScrollViewInsets = false;这样就需要自己考虑navigationbar下面的视图的布局了,例如下移64等等
2、self.edgesForExtendedLayout = UIRectEdge.None;将view下移64,另外如果有tabBar,高度会缩减40,无需我们手动设置
3、self.navigationController?.navigationBar.translucent = false
self.tabBarController?.tabBar.translucent = false;设置不透明,这样与2效果一样,好处是可以分别设置navigationbar和tabBar

1 0
原创粉丝点击