自定义系统NavigationBar时,UIScrollView内容发生偏移的问题
2017-08-21 11:13
405 查看
⭐️最近才遇到的坑,我很纳闷之前为毛没发现:
在使用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
⭐️实际操作过程中,使用下面的方法设置就可以:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.automaticallyAdjustsScrollViewInsets = false;//使scrollview不偏移。
}
在使用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
⭐️实际操作过程中,使用下面的方法设置就可以:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.automaticallyAdjustsScrollViewInsets = false;//使scrollview不偏移。
}
相关文章推荐
- iOS7之后,关于NavigationBar存在时,UIScrollView内容发生偏移的问题
- iOS7之后,关于NavigationBar存在时,UIScrollView内容发生偏移的问题
- UIScrollView内容偏移的问题
- 将原点移动到navigationBar下面(或UIScrollView和 cell加载子视图偏移64问题)
- iOS 将原点移动到navigationBar下面(或UIScrollView和 cell加载子视图偏移64问题)
- IOS7 系统下的UIScrollView偏移问题
- UIScrollView偏移问题
- Android截图包含webview时,webview部分空白(其他部分正常),此问题发生在系统4.4及以上
- 关于华为手机自定义view中NavigationBar显示与隐藏造成高度问题的解决办法
- Android截图包含webview时,webview部分空白(其他部分正常),此问题发生在系统4.4及以上
- 【完美解决系列】Android在自定义Dialog中TextView内容显示不全的问题
- iOS 解决UIScrollView布局问题(布局受statusBar和NavigationBar影响)
- iOS 开发 右滑手势返回及UIScrollView偏移问题
- masonry+UIScrollView+UICollectionView自动布局偶尔向下偏移的问题
- 关于点击UIScrollView跳转的问题,以及怎么在UITableView上展示滚动视图,九宫格,自定义Cell等
- iOS - UIScrollView 显示出来后 偏移64的问题
- [iOS]UIScrollView嵌套内容在左右拨动的时候自动被顶上问题
- 设置UIWebView为自定义UIScrollViewDelegate代理冲突问题
- 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)
- 随系统字体放大,某个View内容显示不全问题怎么修改?