iOS 11 新添加了,安全域的概念,电池栏也从原来的20变成了44
那么问题来了,对于滚动类视图,要设置视图的大小的时候就需要拿到 电池栏的高度;
- 方法一 :动态计算电池栏的高度
KScreenHeight - StatusRectHeight - NavRectHeight
.
并且 要添加上 下面2行代码
if (@available(iOS 11.0, *)) {
_mainTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
因为我们的项目中,设置了
[UINavigationBar appearance].translucent = NO;
所以,当用方法二的时候,push的时候,会窜一下;
因此,设置tableview的frame的时候,只能动态获取 电池栏的高度
KScreenHeight - StatusRectHeight - NavRectHeight
.
- 方法二 : 利用iOS 11 新增的方法 :viewSafeAreaInsetsDidChange
-(void)viewSafeAreaInsetsDidChange{
[super viewSafeAreaInsetsDidChange];
CGRect rect = self.mainTableView.frame;
rect.origin.y = VIEWSAFEAREAINSETS(self.view).top;
rect.size.height = KScreenHeight - rect.origin.y;
self.mainTableView.frame = rect;
}
注意 : 当设置 translucent
为NO
的时候,采用上面方法,push的时候,会窜一下;
为解决这个问题,把 translucent
为YES
, 这样导致的结果,
- iOS 11的问题解决了,可以正常了;
- iOS 11 以下的,对于
滚动视图
和不滚动视图
, 控件的布局,y 都需要设置为 64 开始。- iOS 11 以下,对于
滚动视图
, 有个automaticallyAdjustsScrollViewInsets
属性,系统默认为YES
【ps: 当为YES 的时候,视图会自动向下移动 64的距离】
但是, 这个方法不能采取,因为 现在导航栏为透明的,automaticallyAdjustsScrollViewInsets
属性 虽然可以使得滚动视图
从64的位置开始, 当上下滑动tableview
的时候,navigation 会透出 tableview的内容; - iOS 11 以下,对于
非滚动视图
, 那么只能设置 第一个控件从 64 的位置开始,此方法可行;
下面的这个方法也能实现,但是对于从一个隐藏了导航栏,再push到有透明导航栏的页面,就会出现个问题,push的时候会有个阴影存在,此方法不能采取。
- iOS 11 以下,对于
//设置后,控制器的view的frame的坐标Y增加64px紧挨着navigationBar下方,
self.edgesForExtendedLayout = UIRectEdgeNone;
总结 : 设置 translucent
为YES
之后呢,就导致了,需要分情况设置 iOS 11 以下的控件内容了,所以,目前,我感觉还是动态获取 电池烂的方法比较好
网友评论