最新消息:文章中包含代码时,请遵守代码高亮规范!

IOS11的适配工作【原创】

iOS Ace 897浏览 0评论

IOS11出来有半年了,期间遇到很多项目的适配问题,在这里整理一下, 希望能给别人带来帮助。由于水平有限,如果出现问题和错误,希望大家能留言给我,我会及时更正,大家一起共同进步。

UIScrollView、UITableView、UICollectionView

大家在iOS11设备上运行出现最多问题应该就是tableview莫名奇妙的偏移20pt或者64pt了。。原因是iOS11弃用了automaticallyAdjustsScrollViewInsets属性,取而代之的是UIScrollView新增了contentInsetAdjustmentBehavior属性,这一切的罪魁祸首都是新引入的safeArea。修改他的方法如下


if (@available(iOS 11.0, *)) {

mainView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

mainView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);

mainView.scrollIndicatorInsets = mainView.contentInset;

}

大家把其中的mainView换成大家需要适配的view就行了。

 

estimatedRowHeight

在IOS11下,tableview的刷新函数经常会有一个很严重的延迟,如果当前tableview不在头部,那么刷新起来更加的难看。那到底是什么原因导致的呢?

主要原因就在estimatedRowHeight。

estimatedRowHeight是一个预估高度,iOS11之前是为0,在iOS11下,这个值默认为44

我们知道tableView是继承于ScrollView的,一个scrollView能滑动,需要设置contentSize,那么tableView的contentSize怎么来呢?iOS11之前,会调用tableView每一个cell的heightForRowAtIndexPath来算出整个高度,从而相加得出contentSize来,这一个步骤挺耗性能!

而使用MJRefresh在iOS11下要让estimatedRowHeight=0,因为MJRefresh底部的上拉刷新是根据contentSize来计算的,当数据更新的时候,得出来的contentSize只是预估的。

所以使用了MJ刷新的情况下,需要如下处理代码

dataTabelView.estimatedRowHeight =0;
dataTabelView.estimatedSectionHeaderHeight =0;
dataTabelView.estimatedSectionFooterHeight =0;
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
return nil;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
return nil;
}

automaticallyAdjustsScrollViewInsets

automaticallyAdjustsScrollViewInsets不是一个在IOS11上适配的属性,他在IOS10之前就有,因为经常需要处理,所以也在这里交代一下

automaticallyAdjustsScrollViewInsets,当设置为YES时(默认YES),如果视图里面存在唯一一个UIScrollView或其子类View,那么它会自动设置相应的内边距,这样可以让scroll占据整个视图,又不会让导航栏遮盖。

当controller上的第一个子视图不是scrollview以及其子类的时候,就会取消内边距。此时原本全屏的scrollview设置的frame(0,0,self.view.frame.size.width,xx)就会从状态栏开始算起,如果应用有导航栏的话,那么就会遮盖住视图的64个高度

解决方案:

  1. self.automaticallyAdjustsScrollViewInsets = NO;禁用掉自动设置的内边距,自行控制controller上index为0的控件以及scrollview控件的位置
  2. self.edgesForExtendedLayout = UIExtendedEdgeNone;这种方式设置,不需要再重新设置index为0的控件的位置以及scrollview的位置,(0,0)默认的依然是从导航栏下面开始算起

 

希望这些内容能给大家带来帮助。

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/23006.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Ace的打赏,我们会更加努力!    如果您想成为作者,请点我

发表我的评论
取消评论

表情