iOS系统

iOS应用适配iPhoneX

2018-01-01  本文已影响0人  _铲屎官_

2017年,苹果公司推出了一款平平无奇的iPhone8的同时,也推出了苹果公司10周年的大招产品——iPhone X(ten)。iPhoneX如今已经面世,造型惊艳之余,高耸入云的价格也确实让广大消费者感到肾疼,不愧是iPhone 疼。
废话不多说了,我要开始唠嗑点东西了。

屁股镇楼,不知道镇不镇得住.jpeg

关于适配iPhoneX的启动页

可爱的iPhoneX.jpeg
既然可爱的iPhoneX增大了自己屏幕比例,又增加一个非主流的刘海,那么为她准备一个特殊的启动页就成了一个必然的事情了。
在整个iPhoneX的适配过程中,增加新的启动页直接决定了应用在iPhoneX上是否能够全屏幕显示。。关于这一点让大家感受一下缺少启动页的威力。。整容前👇👇👇👇 没有启动页时启动了.jpg
没有启动页的应用首页.jpg

如果没有增加新的启动页话,在iPhoneX上运行应用不能正常显示全屏幕。。。

更新最新版的Xcode9,创建一个新的LaunchImage文件,新的LaunchImage中会针对iPhoneX增加新的对应栏。


LaunchImage.jpeg

iPhoneX的启动页比例为1125x2436,增加新的启动页后,运行应用就正常显示了,整容后👇👇👇👇


整容脸之启动页.jpg
整容脸之应用首页.jpg

iPhoneX 导航栏 + 状态栏的高度发生了改变

导航栏 + 状态栏的高度等于64,作为iOS开发来说这是常识啊!但苹果永远都是一个颠覆他人常识的公司,为了显得iPhoneX很不一样,颠覆者iPhoneX的导航栏 + 状态栏高度为88

代码中写死了64造成的.jpeg

因为当时贪图一时的快感,工程的代码中包含了大量写死64的计算代码,如今适配iPhoneX这个混蛋的时候真特么难受啊。😢
重点 :别直接写64了,也别直接写88,写宏吧!
重点 :别直接写64了,也别直接写88,写宏吧!
重点 :别直接写64了,也别直接写88,写宏吧!

我的宏大概是这么写的

#define kNavigationBarHeight (iPhoneX ? 88 : 64)
#define kTabbarHeight (iPhoneX ? 83 : 49)

因为iOS11 之后,界面的布局有了safe area(安全区域) 一说,所以建议在工程中对一些控件的布局设置使用Masonry针对safe area边距,相对位置这样的布局方式,这样配置布局只针对safe area,以后无论导航栏变成多高,都不会对布局产生影响。

[self.demoView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.left.right.bottom.includeSafeArea_equalTo(self.view);
    }];

最新的Masonry有对Safe Area做一些适配,但自己还是写了一个针对Safe Area的布局方法。下面👇👇👇👇

- (MASConstraint * (^)(id))includeSafeArea_equalTo{
    return ^id(id attribute) {
        if (@available(iOS 11.0, *)) {
            if ([attribute isKindOfClass:[UIView class]]) {
                UIView *view = (UIView *)attribute;
                return self.equalToWithRelation(view.mas_safeAreaLayoutGuide, NSLayoutRelationEqual);
            }else{
                return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
            }
        }else{
            return self.equalToWithRelation(attribute, NSLayoutRelationEqual);
        }
    };
}

Safe Area是个什么鬼哦

iPhoneX的顶部增加44pt,底部增加34pt。
iOS11面世后,苹果公司对于布局设置上引入了safeAreaLayoutGuide的概念。
safeAreaLayoutGuide是一个相对抽象的概念,为了便于理解,我们可以把safeAreaLayoutGuide看成是一个“view”,这个“view”系统自动帮我们调整它的bounds,让它不会被各种奇奇怪怪的东西挡住,包括iPhone X的刘海区域和底部的一道杠区域,可以认为在这个“view”上一定能完整显示所有内容。
以下绿色部分就是当前控制器view的safeAreaLayoutGuide区域

绿色的区域就是传说中的safeArea.jpeg
绿色的区域就是横屏传说中的safeArea.jpeg

在我看来,他最大的作用是作为参照物,让view可以相对某个view的safeAreaLayoutGuide做布局,从而保证view能正常、安全地显示(相对的那个view不一定要是父view)

在一种常见的使用场景里,以前我的某个view是相对于控制器的view做布局,现在是相对控制器view的safeAreaLayoutGuide做布局了。
使用safeAreaLayoutGuide和safeAreaInsets,以一种动态的方式,一劳永逸地解决iPhone X甚至后续所有机型的适配问题

上一篇下一篇

猜你喜欢

热点阅读