iOS11和iPhoneX的适配问题

1、 tableView 头部视图和尾部视图出现一块留白问题

iOS11下tableview默认开启了self-Sizing,也就是自动估高机制,有两种办法去掉留白:
tableView的style:UITableViewStyleGrouped类型,默认tableView开头和结尾是有间距的,不需要这个间距的话,可以通过实现heightForHeaderInSection方法(返回一个较小值:0.1)和viewForHeaderInSection(返回一个view)来去除头部的留白,底部同理。
iOS 11上发生tableView顶部有留白,原因是代码中只实现了heightForHeaderInSection方法,而没有实现viewForHeaderInSection方法。iOS 11之后应该是由于开启了估算行高机制引起了bug。添加上viewForHeaderInSection方法后,问题就解决了。或者添加以下代码关闭估算行高,问题也得到解决。
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

2、 tabbar底部空白问题

wechatimg160

3、tableView偏移20、64问题适配

原因分析
原因是iOS 11中Controller的automaticallyAdjustsScrollViewInsets属性被废弃了,所以当tableView超出安全区域时系统自动调整了SafeAreaInsets值,进而影响adjustedContentInset值,在iOS 11中决定tableView的内容与边缘距离的是adjustedContentInset属性,而不是contentInset。adjustedContentInset的计算方式见本文第二部分内容。因为系统对adjustedContentInset值进行了调整,所以导致tableView的内容到边缘的距离发生了变化,导致tableView下移了20pt(statusbar高度)或64pt(navigationbar高度)。
如果你的APP中使用的是自定义的navigationbar,隐藏掉系统的navigationbar,并且tableView的frame为(0,0,SCREEN_WIDTH, SCREEN_HEIGHT)开始,那么系统会自动调整SafeAreaInsets值为(20,0,0,0),如果使用了系统的navigationbar,那么SafeAreaInsets值为(64,0,0,0),如果也使用了系统的tabbar,那么SafeAreaInsets值为(64,0,49,0)。
解决方法
if (@available(iOS 11.0, *)) {
    self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;//UIScrollView也适用
}else {
    self.automaticallyAdjustsScrollViewInsets = NO;
}

4、屏幕未充满

相信一部分开发者已经在着手适配iPhone X 和iOS11 了,xcode9测试版运行自己的项目会发现项目没有充满屏幕,上下会有黑色区域的情况,大家别慌,这是没有设置对应的启动图,iPhone X对应像素 1125 * 2436
大家可以自己添加图片或者准备一张尺寸:1125 * 2436的启动图片, 移动到LaunchImage的Finder目录中, 并在LaunchImage中的Contents.json文件中增加 (注意Json格式):
{
    “extent” : “full-screen”,
    “idiom” : “iphone”,
    “subtype” : “2436h”,
    “filename” : “图片名字.png”,
    “minimum-system-version” : “11.0”,
    “orientation” : “portrait”,
    “scale” : “3x”
}

5、解决加载webView的时候向下移动部分距离,下面闪现黑色部分

#ifdef __IPHONE_11_0
    if (@available(iOS 11.0,*)) {
        self.mTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    }
#else
    self.automaticallyAdjustsScrollViewInsets = NO;
#endif

6、导航栏向上跑了部分距离,定义一个高度宏定义

#define NAVIGATION_HEIGHT (CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]) + CGRectGetHeight(self.navigationController.navigationBar.frame))
在你设置的self.navigationBar.frame = CGRectMake(0, 0,ScreenWidth, NAVIGATION_HEIGHT);下面添加
#ifdef __IPHONE_11_0
if (@available(iOS 11.0, *)) {
    self.navigationBar.frame = CGRectMake(0, STATUSBAR_HEIGHT,ScreenWidth, NAVIGATION_HEIGHT);
}
#endif

7.UIImagePickerController iOS11调起相册 中的照片被导航栏遮挡

为了适配iOS11下来刷新下下偏移问题,全局设置了 [UIScrollView appearance] 的ContentInsetAdjustmentBehavior为UIScrollViewContentInsetAdjustmentNever导致ScrollView向上偏移了,而在iOS11以下却没问题
if (@available(iOS 11.0, *)){
        [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }
解决办法:将导航条的毛玻璃效果去除掉就可以了
 UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
    pickerController.editing = YES;
    pickerController.delegate = self;
    pickerController.allowsEditing = YES;
//    去除毛玻璃效果
    pickerController.navigationBar.translucent = NO;
    pickerController.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;
    [self presentViewController:pickerController animated:YES completion:nil];

发表评论

电子邮件地址不会被公开。 必填项已用*标注