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)]];
网友评论