美文网首页
隐藏导航栏,偏移20px

隐藏导航栏,偏移20px

作者: dequal | 来源:发表于2019-05-14 21:04 被阅读0次

1:让ViewController在NavigationBar下面开始布局。

automaticallyAdjustsScrollViewInsets作用

当Controller上存在唯一一个UIScrollview及其子类时,会自动设置内边距,让scrollview占据整个视图,又不会让导航栏覆盖。当Controller上的第一个子视图不是UIScrollview及其子类时,不会自动设置内边距,原点会从状态栏开始,而不是导航栏下面,造成64px的偏移。解决方案有两种:

/// 取消系统自动布局内边距
if ([nav respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
    nav.automaticallyAdjustsScrollViewInsets = NO;
}
    /// 取消扩展的边距
    if ([nav respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
        nav.edgesForExtendedLayout = UIRectEdgeNone;
    }
    /// 在iOS11取消内边距要使用新方法
    UIScrollView *sv = nil;
    sv.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

也许你已经发现了,当你隐藏了页面中的导航栏,并且在self.view上添加了一个tableview/scrollView时,你的tableview的位置会向下偏20个单位,并且你怎么找都找不到问题所在。。。因为这就不是你的问题。

你会发现在ios7.1及以上的系统下都会存在这个bug(7.1版本以下我没有试过,可以自己试试),解决办法就是不要直接把你的tableview加在self.view上,而是先要在self.view上放上一个任意的子视图,再将tableview添加在self.view上,这样tableview就不是self.view的第一子视图了。归结为一句话就是滚动视图不能作为父视图的第一子视图。

问题代码
self.navigationController.navigationBar.hidden = YES;
解决方法,就是不让滚动视图作为父视图的第一子视图。
// 添加占位视图
[self.view addSubview:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]];

相关文章

网友评论

      本文标题:隐藏导航栏,偏移20px

      本文链接:https://www.haomeiwen.com/subject/prfyaqtx.html