有关iOS11和iPhoneX的适配问题

作者: 苏东没有坡 | 来源:发表于2017-09-24 17:57 被阅读26110次

    一:iOS11 问题

    有关iOS11 ,最大的变化就是增加了一个安全区域(safeArea)的概念,iOS11 适配的大部分问题都是由于它引起的。
    如果还不太了解概念,推荐阅读 iOS 11 安全区域适配总结这篇文章。

    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. TableView 上拉刷新reloadData 时视图发生偏移

    举个例子,我们加载数据分页一页10条数据,当我们上拉刷新请求第二页的时候,我们希望的是视图流畅地展示第11个cell的一部分,然后当前页面仅仅展示第10个cell,甚至会向上偏移一点。
    这个问题也是iOS11 估算行高引起的问题,关闭估算行高

      self.tableView.estimatedRowHeight = 0;
      self.tableView.estimatedSectionHeaderHeight = 0;
      self.tableView.estimatedSectionFooterHeight = 0;
    

    3. NavigationBar 的变化

    • 新增了一种lagreTitle的样式,默认是关闭的,暂时不用管他

    • 集成了 UISearchController,很方便

    • 图层发生了变化:
      如果设置了titleView,titleView原来是直接添加到UINavigationBar上,iOS11后,titleView会加在
      UITAMICAdaptorView上,UITAMICAdaptorView这个图层是添加在UINavigationBarContentView上的,
      UINavigationBarContentView之上才是UINavigationBar。

    • titleView支持autolayout,你可能会发现你的titleView变窄了,你可以通过重写 intrinsicContentSize方法来解决这个问题

      - (CGSize)intrinsicContentSize {
          return UILayoutFittingExpandedSize;
      }
    

    4 .iOS 11 权限问题

    iOS11对相册的权限key做了调整,将原来的 NSPhotoLibraryUsageDescription改成了NSPhotoLibraryAddUsageDescription。详见:Cocoa Keys

    4. iOS11系统下SVProgessHUD默认的loading文字变灰问题

    屏幕快照 2017-10-11 上午11.43.46.png

    具体原因还未找到,坐等更新,暂时使用了SVP的自定义样式解决,望有遇到过的大佬不吝指教

      [SVProgressHUD setDefaultStyle:SVProgressHUDStyleCustom];//设置loading样式,默认白底黑字
      [SVProgressHUD setBackgroundColor:HEXCOLOR(0xf9f9f9ff)]; //设置loading底部背景颜色
    

    二: iPhoneX问题

    1. 适配iPhoneX的时候上面流海的屏幕仍是黑色,内容没有充满屏幕

    • 这是因为你没有设置对应大小的启动图,iPhone X对应像素 1125 * 2436,将启动图添加到LaunchImage中后,还要在Contents.json文件中增加下面的内容
    {
        "extent" : "full-screen",
        "idiom" : "iphone",
        "subtype" : "2436h",
        "filename" : "你的启动图名字.png",
        "minimum-system-version" : "11.0",
        "orientation" : "portrait",
        "scale" : "3x"
    }
    
    2.webView,tableView页面无导航栏时,顶部出现44高度的空白
    image.png

    *iOS11中废弃了automaticallyAdjustsScrollViewInsets,取而代之的是contentInsetAdjustmentBehavior属性,adjustedContentInset属性决定了tableView与边缘的距离。iPhone X竖屏时控制器视图的safeAreaInsets是(44,0,34,0)

    #pragma mark -- 废弃了的automaticallyAdjustsScrollViewInsets
    @property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED_WITH_REPLACEMENT
    ("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); // Defaults to YES
    
    #pragma mark -- UIScrollView新属性
    /* When contentInsetAdjustmentBehavior allows, UIScrollView may incorporate
     its safeAreaInsets into the adjustedContentInset.
     */
    @property(nonatomic, readonly) UIEdgeInsets adjustedContentInset API_AVAILABLE(ios(11.0),tvos(11.0));
    
    

    contentInsetAdjustmentBehavior属性有以下几个枚举值:

    /*
    1. automatic 和scrollableAxes一样,scrollView会自动计算和适应顶部和底部的内边距并且在scrollView 不可滚动时,也会设置内边距.
    2. scrollableAxes 自动计算内边距.
    3. never 不计算内边距
    4. always 根据safeAreaInsets 计算内边距
    */
    typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {  
        UIScrollViewContentInsetAdjustmentAutomatic, 
        UIScrollViewContentInsetAdjustmentScrollableAxes,
        UIScrollViewContentInsetAdjustmentNever,
        UIScrollViewContentInsetAdjustmentAlways,
    }
    
    @property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior;
    @property(nonatomic, readonly) UIEdgeInsets adjustedContentInset;
    
    //adjustedContentInset值被改变的delegate
    - (void)adjustedContentInsetDidChange; 
    - (void)scrollViewDidChangeAdjustedContentInset:(UIScrollView *)scrollView;
    
    

    添加如下代码解决问题

    if (@available(iOS 11.0, *)) {
        tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    }
    
    3.iPhoneX 在push进入 webView页面时,底部会有黑边一闪而过
    • 这也是由iOS11的safeArea引起的问题。
    • 发生这种情况, 你可能设置了webview 的高度为 SCREEN_HEIGHT-NAVBAR_HEIGHT(屏幕高度-(导航栏高度+状态栏高度)),你有两种选择:
      1)设置webview高度为 SCREEN_HEIGHT-NAVBAR_HEIGHT-34, 34为底部的安全区域间距。
      2)添加如下代码
    if (@available(iOS 11.0, *)) {
        webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    }
    

    第一种方法会让webview的视图和底部有34的距离,第二种会使webview保持全屏,但一部分区域会被iPhoneX底下的黑条遮住,美丑自评

    4.页面底部有固定的footerView被遮挡,以及一些自定义输入框弹起键盘被遮盖问题

    iPhoneX需要将底部一些控件的位置往上移34,弹出的键盘隐藏时也可能会出现问题,根据实际情况修改。

    5.视图高度问题

    以前编写代码的时候,定义tableView高度可能只是用了SCREEN_HEIGHT-64-49(有tabbar的时候),也可能是SCREEN_HEIGHT-64(tabbar隐藏的时候),在iphoneX上面这样的写法会出现问题,特别是一些死页面,tableView会拉不到最底部。

    参考
    以上内容参考了以下文章,阅读原文请点击以下链接
    iOS11 & iPhone X 适配指南 http://url.cn/5wjMhix
    App界面适配iOS11 http://www.jianshu.com/p/352f101d6df1
    iOS 11 安全区域适配总结 http://www.jianshu.com/p/efbc8619d56b

    相关文章

      网友评论

      • e99c92ed069a:帮了我的大忙
      • 高高叔叔:不错、老铁干货。解决了我的问题啊。
      • 喵喵退后:留个爪解决了一个问题
      • wustzhy:将原来的 NSPhotoLibraryUsageDescription改成了NSPhotoLibraryAddUsageDescription。
        注意:上传App Store时,不要删NSPhotoLibraryUsageDescription,增加一个NSPhotoLibraryAddUsageDescription,否则fail binary....被驳回
      • 0621058d39c6:版主 这个侧滑框架 在iPhoneX 适配会有一大段空白 应该怎么解决
      • HHLM:楼主你好,ios11滑动删除 加入根据需求让某一个不需要滑动删除 就不让滑动 咋么实现
        HHLM:@一与宇 解决问题了 ios中按钮的扩展中使用了runtime 然后这个runtime拦截了按钮的点击方法,导致删除不响应
        苏东没有坡:不太清楚具体的需求,提个思路吧,自定义删除按钮,利用手势进行删除操作,根据cell的索引去判断能否滑动删除
      • adf61a070c47:返回按钮的字体怎么去掉呢。
      • _码奴:谁知道怎么去掉ios11导航栏titleView的左右边距吗?急求解决方案
        素然年华:@_码奴我看错了,你再研究研究
        _码奴:@素然年华 哪个xib,导航所在的视图的吗?我们这个界面没有用到xib啊
        素然年华:xib 布局的时候constrain to margins 对勾去掉
      • 管你爱不爱:搜一下ios11的适配,都是一样的,是不是都是复制别人的啊?
      • FengxinLi:请问一下 我设置了 UIImage *backButtonImage = [[UIImage imageNamed:@"icon_tabbar_back"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        self.navigationBar.backIndicatorImage = backButtonImage;
        self.navigationBar.backIndicatorTransitionMaskImage = backButtonImage;
        但是自定义的返回箭头还是有重复的呢?
      • iOS白水: [[UIBarButtonItem alloc] initWithCustomView:btnBack]。 设置约束都正确,界面显示正常。再5s下。返回按钮区域会变小。 测试其他 uinavibarbuttonitem 都是这样的。响应区域变小了。有解决方案么?
      • hu9134:您好,能请教一个问题吗?我升级了iOS11之后,UITableViewCell左滑删除就不好用了,很不灵敏,很容易就选中cell,执行了跳转方法,在之前的版本就是好的,请问下能有什么原因啊?谢谢,也没有别的手势冲突啊,运行在iOS10上就是好的
        gushidekaitou:我记得11好像自带这个功能,你可以看看是不是哪里冲突了..
      • 苦笑男神:更新Xcode9正式版之后问题:

        1.代码块 方法和类按住 command是有提示的,但是if,for, switch等不提示,博主是否有这样的问题?还是需要设置才能提示。
        2.代码折叠不好用了,,比如if、for等,无法折叠,只能折叠方法、类
        3,控制器不输出NSLog信息。
        TeWuJia:@VIVILIA NSLog 不打印信息我遇到了,搞了好久,包括OS_ACTIVITY_MODE重装xcode也不行,没搞定,换了8.3.3,有搞定的不吝赐教
        苦笑男神:@VIVILIA 模拟器调试,Xcode控制台不输出NSLog信息,真机调试有NSLog输出。scheme里面有OS_ACTIVITY_MODE,但是如果将这个去掉,控制器会额外输出很多其他东西。
        苏东没有坡:1,2 两种情况我也是一样,更新了xcode9以后也为此找了不少资料,没有发现if,for的方法,不打印NSLog的情况没有遇到,建议你去edit scheme里面看下设置

      本文标题:有关iOS11和iPhoneX的适配问题

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