美文网首页
iOS 11 和 iPhone X 适配问题集锦

iOS 11 和 iPhone X 适配问题集锦

作者: 打不死的小怪兽 | 来源:发表于2017-09-29 11:40 被阅读587次

    一、Xcode9下相册等访问权限问题

    查了资料说iOS11下,苹果对相册的权限key做了调整,原来的 NSPhotoLibraryUsageDescription ,在iOS11之后,改成了NSPhotoLibraryAddUsageDescription
    针对于此测试了一下应用,果然毫无悬念, 立即去 info.plist 把 key 改成NSPhotoLibraryAddUsageDescription, 很快解决问题了.
    图3: info.plist内设置NSPhotoLibraryAddUsageDescription权限

    1.png

    二、NSLocationAlwaysAndWhenInUseUsageDeion

    在IOS11,原有的NSLocationAlwaysUsageDeion被降级为NSLocationWhenInUseUsageDeion。因此,在原来项目中使用requestAlwaysAuthorization获取定位权限,而未在plist文件中配置NSLocationAlwaysAndWhenInUseUsageDeion,系统框不会弹出。建议新旧key值都在plist里配置,反正我试下来是没有问题,唯一的区别是使用requestAlwaysAuthorization获取权限 IOS11系统弹框会把几种权限级别全部列出,供用户选择,显然更人性化了哈~~

    2.jpg

    四、 MJRefresh下拉刷新适配 iOS 11和 iPhone X问题

    项目在不同的模拟器下分别编译看效果, 底部自定义 tabbar 显示没有问题, 但顶部是隐藏了 NavigationBar并采用了MJRefresh下拉刷新,发现有错位..


    iOS 11 和 iOS 11以下的运行对比 iPhoneX 下拉刷新出现错位问题
    我的解决方案:

    因为我的布局是 UIScrollVIew, 所以只要设置 iOS 11的新特性方法contentInsetAdjustmentBehaviorUIScrollViewContentInsetAdjustmentNever就可以了 以此类推,如果是 UITableView 布局的,也是设置contentInsetAdjustmentBehavior

    判定 iOS 11的方法, 官方建议的方法:

    以下是官方的屏幕尺寸, 原本最初的想法就是根据屏幕的高度812pt来判定


    官方图片

    官方建议的方法 :

    if (@available(iOS 11.0, *)) {
    }else{
    }
    
    我的适配代码:
    if (@available(iOS 11.0, *)) {
          _collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
     } else {
     }
    
    判定iPhoneX的方法 :
    #define isIPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? [[UIScreen mainScreen] currentMode].size.height==2436 : NO)
    

    其他的一些相关适配方法:(摘自 MJRefresh讨论区的解决方案)

    • 注:首先这个下拉刷新的偏移量并不是MJRefresh造成的,但是确实需要适配,比如通栏ViewController显示的时候,刘海会遮住下拉刷新的组件,解决办法是对下拉刷新控件自定义,调整内部组件的布局,通栏的ViewController地方使用自定义的下拉控件。

    对于iOS11下的iPhoneX适配下拉刷新有以下几点:

    1、首先请配置相应的启动图,尺寸是1125*2436;
    2、对于通栏ViewController中的UIScrollView,系统会默认根据contentInsetAdjustmentBehavior属性改变其bounds的y值为-44,导致UIScrollView中的所有子控件下移,解决办法是,对于通栏ViewController,请设置其UIScrollView的contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever。

    其他适配点:

    1、iOS11下的iPhoneX的导航栏为高度44,状态栏高度也调整为44,所以整个顶部状态栏的高度和导航栏的高度一起是88,自定义导航栏的同学需要根据系统机型控制导航栏高度;
    2、iOS11下的iPhoneX的tabBar的高度调整为83,自定义tabBar的同学建议使用Frame布局;
    3、iOS11下的iPhoneX下,屏幕底部默认显示了长条状的Home键指示器,可以通过UIViewController (UIHomeIndicatorAutoHidden)分类中的prefersHomeIndicatorAutoHidden来隐藏,但是官方并不建议这样做。

    iPhone X 导航栏错位问题

    iOS11下的iPhoneX的导航栏为高度44,状态栏高度也调整为44,所以整个顶部状态栏的高度和导航栏的高度一起是88,所以在自定义导航栏里针对 iPhone X 修改的高度

    我的解决方法: 我所有的项目都是使用了宏定义参数的方法来设置各种控件的, 所以只要改写这些相关宏定义参数, 整个项目都同步做好了适配, 所以平时的积累和归纳思维很重要,关键时刻可以减轻很多不必要的重复工作量.

    /*****宏定义 *****/
    //导航栏高度
    #define  MANavBarHeight  isIPhoneX ? 88 : 64
    //底部Tabbar 高度
    #define MATabBarHeight  isIPhoneX ? 83 : 49 
    //状态栏高度
    #define  MAStatusBarHeight  isIPhoneX ? 44 : 20
    

    http://www.jianshu.com/p/352f101d6df1

    相关文章

      网友评论

          本文标题:iOS 11 和 iPhone X 适配问题集锦

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