iOS12适配

作者: 香橙柚子 | 来源:发表于2018-09-18 16:08 被阅读758次

    iOS 12系统目前看来并没有多大变化.不像iOS 11那样增加了新的安全区域概念.在iOS 12中新机型的安全区域概念没有太大变化.

    主要就是机型的适配和Xcode10升级后的问题.
    首先附上iOS 12支持的所有机型的尺寸.

    适配iPhone XR/iPhone XS Max

    1.启动图

    升级Xcode10后,打印屏幕的宽高:

    #define rmScreenW [UIScreen mainScreen].bounds.size.width
    #define rmScreenH [UIScreen mainScreen].bounds.size.height
    

    会发现无论是iPhone XS Max还是iPhone XR,打印出来的尺寸高度都是812,这是iPhone X的高度.与真实的新机尺寸不符.

    LaunchImage中只有iPhone X/iPhone XS
    这可能是Xcode的bug.
    项目中使用LaunchImage来做启动图,但是在LaunchImage中并没有iPhone XS Max和iPhone XR,仔细查找后是因为iOS 8.0 and Later没有被选中,当选中iOS 8.0 and Later后,iPhone XR和iPhone XS Max的启动图就会自动出现.
    如图:

    选中后会自动出现.如图:


    iPhone XS Max和iPhone XR的兼容问题
    这主要是因为没有设置iPhone XR/iPhone XS Max启动图,但是设置了iPhone X启动图,iPhone XR/iPhone XS Max启动的时候会使用iPhone X的启动图,并进行拉伸,进而打印出的宽度为375,高度为812,与实际宽高不符.

    解决方法:只需要向设计要2张启动图即可:
    iPhone XR:828px x 1792px
    iPhone XS Max: 1242px x 2688px

    2.iPhone XR不支持3D-Touch:

    最新的机型iPhone XR是iPhone XS的阉割版,去除了很多功能,手机配置也降低了很多.其中就有3D-Touch.

    当使用3D-Touch的时候,如果需要检测是否支持3D-Touch,使用如下代码:
    OC:

    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
    
    }
    

    Swift:

    self.traitCollection.forceTouchCapability == .availible
    

    备注:不能使用判断手机是否为6S或6SP等来判断是否支持3D-Touch,因为如果用户在设置 -> 通用 -> 3D Touch中将该功能关闭的话,同样forceTouch是不可用的. 而且此功能必须在运行时随时检查.因为用户可能在使用过程中关闭3D-Touch.

    3.代码中判断是否是iPhone X方法

    之前很多人判断手机是否是iPhone X的方法是根据手机尺寸来的.因为需要对刘海做特殊处理.现在这种方法可能不行了.
    可以根据其他的方法,比如StatusBar或者底部安全距离来判断.

    #define rmStatusBarH ([UIApplication sharedApplication].statusBarFrame.size.height)//(44/20)
    #define KIsiPhoneX ((rmStatusBarH == 44.0) ? YES : NO)
    

    也可以:

    #define isIPhoneXSeries     ([UIScreen instancesRespondToSelector:@selector(currentMode)] ?\
    (\
    CGSizeEqualToSize(CGSizeMake(375, 812),[UIScreen mainScreen].bounds.size)\
     ||\
    CGSizeEqualToSize(CGSizeMake(414, 896),[UIScreen mainScreen].bounds.size)\
    )\
    :\
    NO)
    

    4.升级Xcode10后项目报错

    项目中如果使用Cocoapods引用了第三方的库,有可能会升级之后导致编译失败.
    由于我项目中没有使用cocoapods,所以没有遇到,网上查了一下资料,大概是因为:

    1. iOS 12移除了libstdc++, 用libc++替代:
    2. 多个 info.plist 会引起崩溃.

    可以将多余的info.plist删除
    建议方案:

    Xcode->File->Project Settings-> Build System -> Legacy Build System.
    

    相关文章

      网友评论

      • Rijkaa:会发现无论是iPhone XS Max还是iPhone XR,打印出来的尺寸高度都是812 ???
        拜托你自己打印看看
        Rijkaa:@iOS_xuanhe 哦 不设置启动图 前面没有看到
        香橙柚子:LaunchImage启动图没有设置的时候确实是这样的.

      本文标题:iOS12适配

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