iOS 11适配及问题解决方案

苹果虐我千百遍,我待苹果如初恋。 横批:iOS开发苦。
iOS 11系统对于开发者来说,变化不算小,各种适配问题接踵而至。
本文主要介绍 UINavigationBar 层级结构变化,UIScrollView Layout变化,UISearchBar宽高变化,引起的问题的原理分析,着重提出解决方案,还有iPhone X的适配。附言介绍一下Xcode 9的小Tips。

问题一:

1、导航栏高度变化:

iOS 11添加了大标题,由系统属性prefersLargeTitles决定,NavigationBar高度如下图1、2:

图1 iPhone X之前机型.png
图2 iPhone X.png

总结来说:如果都用的系统的NavigationBar,全部无需适配高度。但是(忽略LargeTitle部分)如果自定义的NavigationBar,iPhone X之前机型正常height == 64,对于程序中很多写死的64,简直是福音,无需更改,但对于iPhone X的高度则变成height == 88,不得不适配。可能需要的两个宏定义:

#define kStatusBarHeight      CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame])
#define kNavigationBarHeight  CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]) + CGRectGetHeight(self.navigationController.navigationBar.frame)

2、导航栏图层变化

这个实在是搞大事啊。

在iOS11之后,苹果添加了新的类来管理,navigationBar会添加在_UIButtonBarStackView上面,而_UIButtonBarStackView则添加在_UINavigationBarContentView上面;如果没有给titleView赋值,则titleView会直接添加在_UINavigationBarContentView上面,如果赋值给了titleView,则会新生成_UITAMICAdaptorView,把titleView添加在这个类上面,这个类会添加在_UINavigationBarContentView上面,如下图3、4:


图3.png
图4.png

3、导航栏边距变化

在iOS 11对导航栏里面的UIBarButtonItem的边距也做了调整:

在iOS 11之前,我们可以设置一个width为负值,类型为UIBarButtonSystemItemFixedSpace的navigationBarButton,间按钮挤到屏幕边缘,如下图5:

图5.png

但是iOS 11,这招失效啦,原因就在于NavigationBar图层发生了变化,引起了如下图6的问题:

图6.png
解决方案:
(1)最简单粗暴的方式,在每个需要设置item的VC中,设置button的setContentEdgeInsets:
(2)在viewWillAppear里面,将_UIButtonBarStackView取出来,直接通过layoutMargins设置偏移量。如下:
//设置leftBarButtonItem
for (UIView *view in self.navigationController.navigationBar.subviews[2].subviews) {
        if ([view isKindOfClass:UIStackView.class]) {
            view.layoutMargins = UIEdgeInsetsMake(0, -15, 0, 0);
        }
}
(3)同上述方法2的原理,通过动态运行时,hock住setLeftBarButtonItem:setRightBarButtonItem:系统方法,创建自定义的View,在View的layoutSubviews方法中,找到UIStackView,通过NSLayoutConstraint调整该视图的布局,达到目的,但是也需要在viewWillAppear里面重新创建,不然当push到下一级页面时,再返回,位置会恢复。
转载大神的Demo地址如下:

https://github.com/spicyShrimp/iOS-11-UINavigationItem-SXFixSpace

(4)完全舍弃系统的Navi,自定义Navi,个人不建议使用,不仅要适配 安全区域,如果哪天苹果Daddy心血来潮,又改啦,呵呵。

问题二:滚动视图的变化

1、iOS11弃用了automaticallyAdjustsScrollViewInsets属性

导致的现象:UITableView列表出现错位;页面切换过程中出现抖动问题。
解决办法:

//在基类VC中
if (@available(iOS 11.0, *)) {
      [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}

2、UITableView默认使用Self-Sizing

iOS 11中如果不实现-tableView: viewForFooterInSection: 和 -tableView: viewForHeaderInSection:,那么-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:不会被调用。
这是因为 estimatedRowHeight、estimatedSectionHeaderHeight、 estimatedSectionFooterHeight 三个高度估算属性由默认的0变成了UITableViewAutomaticDimension,导致高度计算不对。
解决方法:实现对应方法或把预估的三个属性值设为0。
目前项目中由此引起的问题不大。

问题三:UISearchBar高度适配

1、SearchBar在Navi的titleView中,高度发生变化

现象:

图 7.png

解决办法:自定义View,重写系统方法,赋值给titleview。如下:

- (CGSize)intrinsicContentSize {
    if (@available(iOS 11.0, *)) {
        return UILayoutFittingCompressedSize;
    }
    return CGSizeZero;
}

iPhone X适配:

1、启动图和AppIcon
图 8.png

启动图规格尺寸:1125 * 2436 (357pt * 812pt @3x)
AppIcon尺寸:多了一个App Store的图标。

图 9.png
2、刘海布局

大部分的系统控件,如NavigationBar、TabBar、表单等会自动适配iPhone X的屏幕,无需适配,但是如果自定义的话,就得手动适配啦,NavigationBar空出刘海位置,TabBar空出HomeBar位置,都位于安全区域以内。

3、横屏布局,尚未研究。

Xcode 9的小Tips:

1、导入图片问题

直接将图片拖入工程的粗暴方式已经不行啦, 会导致无法读取图片,可以通过“Add File To ....”,不习惯好吧。Xcode 9可以打开Assets,将图片资源直接拖进去,直观方便。

2、Assets中添加颜色

在Asset中,可以创建颜色了。右键选择New image set,填充RGBA值或十六进制值即可。使用中直接使用新的colorwithname,参数填入创建时的名字即可。使用时一定记得区分系统版本。

3、command键复原,直接跳转

可在Preferences --> Navigation --> Command-click on Code 中选择Jumps to Defintion即可。

参考

你可能需要为你的 APP 适配 iOS 11
App界面适配iOS11
iOS11 导航栏按钮位置问题的解决

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 苹果公司于2017年9月13日凌晨发布了两款新的手机—— iPhon 8与iPhone X,作为全新的屏幕样式 i...
    LearningCoding阅读 5,996评论 2 6
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • 大爱~雾面粉状口红 这个话题是我的小心机,因为最近已经无法自拔地深爱上了雾面口红。没有哑光口红的春装是不完整的! ...
    颜小欲阅读 169评论 2 2
  • 这是2014年7月开始的小事。 是一个飘着毛毛雨的傍晚。总之原因是我很想要一只猫咪,陪我。那段时间男朋友不在杭州,...
    秒针分针阅读 428评论 3 4
  • 人与人之间如果都能真诚一点,没那么多套路的话,那么这个世界将会又多一分美好! 什么样的生意人,能将自己的公司做的又...
    小馒头0601阅读 337评论 0 0