Iphone X 与 IOS 11 适配记录

一、IOS 11适配


1.1 导航栏

导航栏高度的变化

iOS11之前导航栏默认高度为64pt(这里高度指statusBar + NavigationBar),iOS11之后如果设置了prefersLargeTitles = YES则为96pt,默认情况下还是64pt,但在iPhoneX上由于刘海的出现statusBar由以前的20pt变成了44pt,所以iPhoneX上高度变为88pt,如果项目里隐藏了导航栏加了自定义按钮之类的,这里需要注意适配一下。

导航栏图层及对titleView布局的影响

iOS11之前导航栏的title是添加在UINavigationItemView上面,而navigationBarButton则直接添加在UINavigationBar上面,如果设置了titleView,则titleView也是直接添加在UINavigationBar上面。iOS11之后,大概因为largeTitle的原因,视图层级发生了变化,如果没有给titleView赋值,则titleView会直接添加在_UINavigationBarContentView上面,如果赋值了titleView,则会把titleView添加在_UITAMICAdaptorView上,而navigationBarButton被加在了_UIButtonBarStackView上,然后他们都被加在了_UINavigationBarContentView上,如图:


Iphone X 与 IOS 11 适配记录_第1张图片

所以如果你的项目是自定义的navigationBar,那么在iOS11上运行就可能出现布局错乱的bug,解决办法是重写UINavigationBar的layoutSubviews方法,调整布局,上代码:

- (void)layoutSubviews {
    [super layoutSubviews];
     
    //注意导航栏及状态栏高度适配
    self.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), naviBarHeight);
    for (UIView *view in self.subviews) {
        if([NSStringFromClass([view class]) containsString:@"Background"]) {
            view.frame = self.bounds;
        }
        else if ([NSStringFromClass([view class]) containsString:@"ContentView"]) {
            CGRect frame = view.frame;
            frame.origin.y = statusBarHeight;
            frame.size.height = self.bounds.size.height - frame.origin.y;
            view.frame = frame;
        }
    }
}

再补充一点,看了App适配iOS11发现titleView支持autolayout,这要求titleView必须是能够自撑开的或实现了- intrinsicContentSize方法

- (CGSize)intrinsicContentSize {
    return UILayoutFittingExpandedSize;
}

这里补充一个关于intrinsicContentSize知识点链接
http://blog.csdn.net/hard_man/article/details/50888377

1.2 使用FDTemplateLayoutCell 在IOS11上计算的cell高度不对

Iphone X 与 IOS 11 适配记录_第2张图片

这是因为IOS11上默认是开启了cell的高度估算机制,关闭即可。

    _tableView.estimatedRowHeight = 0;
    _tableView.estimatedSectionFooterHeight = 0;
    _tableView.estimatedSectionHeaderHeight = 0;

二、Iphone X 适配


官方IphoneX适配文档

2.1 启动页的适配

iPhone X采用的和iPhone 6p一样的@3x的图,而不是传说中的@4x图。
如果你是用的是LaunchImage来管理启动页,那就可以找设计妹子弄一张1125 * 2436分辨率的启动图就行。如果你使用的是LaunchScreen来适配的启动页,听我一句也去问问设计妹子吧,毕竟iPhone X的高宽比(iPhone X采用了iPhone 8的宽,却比iPhone 8p都要高)发生了变化,拉伸了设计妹子的图,会给你拼命的,
说的那么多废话,就一点是重要的iPhone X 的屏幕平尺变为1125 * 2436
`

你可能感兴趣的:(Iphone X 与 IOS 11 适配记录)