简书App适配iOS 11

作者: 知傲 | 来源:发表于2017-09-14 22:37 被阅读27288次

随着Xcode GM版本发布,适配iOS 11也就提上了日程,总的来说整个适配过程(不包含适配iPhone X)不是很麻烦。

首先建议观看今年WWDC的一个视频 Updating Your App for iOS 11,视频讲解了iOS 11一些API的变化,对理解适配过程有帮助。

navigation bar

1、导航栏新增了一种大标题样式,默认设置是不开启,所以不需要修改。
2、titleView支持autolayout,这要求titleView必须是能够自撑开的或实现了- intrinsicContentSize,简书的搜索就变成下面这样了

搜索

解决办法比较简单,这个搜索框对应的view实现- intrinsicContentSize方法

- (CGSize)intrinsicContentSize {
    return UILayoutFittingExpandedSize;
}

安全区域适配

iOS 11中ViewController的automaticallyAdjustsScrollViewInsets属性被废弃了,导致了这两个页面出现了问题

image.png image.png

这两个页面都隐藏了系统导航栏,自定义导航栏。

self.automaticallyAdjustsScrollViewInsets = NO;
self.extendedLayoutIncludesOpaqueBars = YES;
self.edgesForExtendedLayout = UIRectEdgeTop;

automaticallyAdjustsScrollViewInsets属性被废弃了,顶部就多了一定的inset,关于安全区域适配,简书上的这篇文章iOS 11 安全区域适配总结介绍得非常详细,请参考这篇文章。

我们采用了比较简单的方法

if (@available(iOS 11.0, *)) {
    self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
    self.automaticallyAdjustsScrollViewInsets = NO;
}

导航栏返回按钮

image.png

之前的代码通过下面的方式自定义返回按钮

UIImage *backButtonImage = [[UIImage imageNamed:@"icon_tabbar_back"]
    resizableImageWithCapInsets:UIEdgeInsetsMake(0, 18, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage
                                                  forState:UIControlStateNormal
                                                barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
                                                     forBarMetrics:UIBarMetricsDefault];

iOS 11 中setBackButtonTitlePositionAdjustment:UIOffsetMake没法把按钮移出navigation bar。
解决方法是设置navigationController的backIndicatorImagebackIndicatorTransitionMaskImage

UIImage *backButtonImage = [[UIImage imageNamed:@"icon_tabbar_back"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.navigationBar.backIndicatorImage = backButtonImage;
self.navigationBar.backIndicatorTransitionMaskImage = backButtonImage;

tableview问题

右边为正确样式
iOS 11中如果不实现-tableView: viewForFooterInSection:-tableView: viewForHeaderInSection:,那么-tableView: heightForHeaderInSection:- tableView: heightForFooterInSection:不会被调用。
这是因为estimatedRowHeight estimatedSectionHeaderHeight estimatedSectionFooterHeight三个高度估算属性由默认的0变成了UITableViewAutomaticDimension,导致高度计算不对,解决方法是实现对应方法或吧这三个属性设为0。
下面这个列表显示不全也是estimatedRowHeight引起,取contentSize出错。
image.png

第三方依赖库问题

1、ReactiveCocoa Unknown warning group ‘-Wreceiver-is-weak’,ignored警告

ReactiveCocoa
简书项目开启Treat warning as error,所有警告都会被当成错误,因此必须解决掉。
RACObserve宏定义如下:
#define RACObserve(TARGET, KEYPATH) \
    ({ \
        _Pragma("clang diagnostic push") \
        _Pragma("clang diagnostic ignored \"-Wreceiver-is-weak\"") \
        __weak id target_ = (TARGET); \
        [target_ rac_valuesForKeyPath:@keypath(TARGET, KEYPATH) observer:self]; \
        _Pragma("clang diagnostic pop") \
    })

在之前的Xcode中如果消息接受者是一个weak对象,clang编译器会报receiver-is-weak警告,所以加了这段push&pop,最新的clang已经把这个警告给移除,所以没必要加push&pop了。
ReactiveCocoa已经不再维护OC版本,大多数OC开发者用的都是2.5这个版本,只能自己fork一份了,谁知github上的v2.5代码不包含对应的.podspec文件,只好到CocoaPods/Specs上将对应的json文件翻译成.podspec文件,如果你也有这个需要,可以修改Podfile如下

pod 'ReactiveCocoa', :git => 'https://github.com/zhao0/ReactiveCocoa.git', :tag => '2.5.2'

2、MGSwipeTableCell 崩溃


左滑cell

MGSwipeTableCell用于实现左滑菜单,在iOS 11上出现了崩溃,github上新版修复了,升级即可

最后,感谢我女朋友在我写这篇文章的时候喂我吃水果。

相关文章

网友评论

  • 直持小崔:抱歉 感谢我女友在我写代码的时候坐在我的前面 😊
  • zhang137:现在都把左右手当女朋友 么 :joy:
  • 4df507470dd5:ReactiveCocoa Unknown warning group ‘-Wreceiver-is-weak’,ignored,更新了pod 'ReactiveCocoa', :git => 'https://github.com/zhao0/ReactiveCocoa.git', :tag => '2.5.2'还是一样 请问有相同遭遇吗
  • 天蚕青春豆:最后一句是真的皮
  • 法克君:就冲这句女朋友喂吃水果也要点赞
  • astring:我是来看评论的
  • Laki只是想做一个程序猿:NSLog(@"兄弟 就这简书,真是辛苦你了,尤其有这顶头的CEO,简书的初心走远了!");
    exit(1)
  • 奥卡姆剃须刀:采访一下,作为简书app的程序员,如何看待最近老包的文章
  • 小小Elle:看得正起劲,猝不及防被喂了一把狗粮:disappointed_relieved:
  • 6179a7c8f80c:楼主你好,我这边适配iPhone X从第一个页面push进第二个页面然后再pop回前一个页面的时候有时会出现页面白屏的情况,只有通过切换下面的Tab才能看到页面,但在其他机型上是不会出现这种情况的。请问楼主,这是怎么回事?
  • 8bfa4aaf88e2:麻烦问下,简书的文本编辑器是用的第三方库吗?
  • 824c3058452c:感谢我女朋友在我看这篇文章的时候给我洗脚。
  • Jamp_iOS:谢谢
  • 爱吃榴莲的程序员:请问一下,push页面之后,系统自带返回键下移 怎么解决
  • Auditore:看到最后一句 对不起 我要举报了
  • Yaanco:楼主,你好,想问下简书以图片形式分享到各个平台时,大小限制是怎么做的呢,
  • 大牛在郑州:我们不一样
  • cijianzy:titleView 设置 intrinsicContentSize 的话会变成不居中...不知道这点是怎么解的?
  • 买了否冷_:简书的长图分享有人有经验么
  • 买了否冷_:看到最后果断举报了…
  • ReinhardHuang:我想问下 if (@available(iOS 11.0, *)) 这种写法是哪里来的?
    我知道Swift中@available放在函数(方法),类或者协议前面。表明这些类型适用的平台和操作系统。
    #available用在条件语句代码块中,判断不同的平台下,做不同的逻辑处理。
    将@available放在条件语句中的写法没见过,请问有官方文档吗?
    菊上一枝梅:@ReinhardHuang 系统提示出来的
    布袋的世界:@ReinhardHuang oc写法
  • 我把今生当成了来世:UIImage *backButtonImage = [[UIImage imageNamed:@"icon_tabbar_back"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    self.navigationBar.backIndicatorImage = backButtonImage;
    self.navigationBar.backIndicatorTransitionMaskImage = backButtonImage;

    这个在iPhone x没作用呢,标题还是存在的
    知傲:@我把今生当成了来世 这个是设置图片的,和文字无关
  • 你家旭哥:我就想知道 哪里买的女朋友能喂水果 求链接
  • 蛮荒星域:已收藏。(注:随意撒狗粮是要承担刑事责任的。):sob:
  • bc61d19920ee:我们要带着正确的三观来感谢作者!不能因为女朋友喂着水果写作就抗议!看这精彩文章的时候老婆喂我喝糖水我会说??
  • 仪态大师:你写的我会信
  • pengmengli:你好,我的导航栏和你说的一样,更新到ios11出问题了,我按你给的方法写的,为什么我返回按钮后面还有一个蓝色的back
    知傲:@pengmengli 因为这个方法只是设置返回按钮的图片
    pengmengli:@zhao0 好,谢谢,可以了,我还想请教个问题,那为什么 [[UIBarButtonItem appearance] setBackButtonBackgroundImage设置返回按钮图片,用这个方法设置返回按钮图片后为什么系统的那个蓝色的返回按钮还在呢
    知傲:@pengmengli 需要再viewController上设置,self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
  • Paxton_:uisearchviewcontroller的searchbar 怎么解决titleview的问题呢? 不使用self.navigationItem.searchController这个方法
  • Eddie_Ai:你这最后一句 仇恨拉的可以!
  • 程序员不务正业:最后一句,你们家人工智能都发展成这样了吗?
  • 6b69124ff056:深夜看到最后一句的我眼泪就留下来
  • 寻找一个不曾有风浪的地方:突如其来的骚,闪了劳资的腰
  • _风雨:原生tabbar push的时候,hidesBottomBarWhenPushed会造成tabbar往上面移动一下,不知楼主遇到过没有:sleepy:
  • 刘勋鹏easy凤凰的故事:起开,那个苹果我削的。
  • 简人Lmy::disappointed_relieved: 狗粮我先吃了,不过那个返回按钮怎么破,解决方法是什么?除了自己写个leftBarButton没有其他方法了,不能用backIndicatorImage方法设置返回图标了?setBackButtonTitlePositionAdjustment这个方法没用了?
  • changeWong:看到最后吐了一地的血:mask:
  • Mr_悟空:防不胜防啊
  • liujieyuu:自定义 UINavigationBar返回按钮时设置 [[UINavigationBar appearance] setTintColor:UINavigationBar背景色 ];否则会出现Back字样
    liujieyuu:@zhao0 统一设置的时候哦,这样应该比较方便啦
    知傲:@liujieyuu back字样从ViewController上去设置,etTintColor:会影响其他按钮
  • 人贩子:最后这波狗粮喂的好
  • 一夜暴富两夜也行:兄台,最后一句过分了
  • vvvei:简书使用的 SVPullToRefresh 不需要适配吗?
    vvvei:@zhao0 你们的全是 UIScrollViewContentInsetAdjustmentNever 啊。。。太暴力了
    知傲:@vvvei 和这个没关系,看安全区域适配部分
  • 菊上一枝梅:你这个评论是用什么排序的 我借鉴一下
    知傲:@Regret_V 排序是后端完成的
    菊上一枝梅:@zhao0 就这篇文章下面评论的排序
    知傲:哪一个评论?
  • DesperadoY:- (CGSize)intrinsicContentSize {
    return UILayoutFittingExpandedSize;
    }
    您好。调用这个方法后确实显示了。但是是靠左显示,没有居中。。请问有人遇到吗?怎么解决?
    知傲:@DesperadoY 也可以在这个方法中返回实际的size,这样就可以居中
    DesperadoY:@zhao0 好的谢谢:smile:
    知傲:这样是内容撑开了,具体的布局(比如居中)是要在这个view中实现
  • MichaelHuyp:看完最后一句 流泪了
  • OnlyLoveYu:冲着最后一句 转到朋友圈了
  • Yaanco:最后这一句很高能。。
  • WuZiMaKi:通篇文章精彩至极,最后一句画龙点睛,升华到前所未有的高度:joy: :joy: :joy:
  • 云逸枫林:最后一句引起强烈不适!
  • EvanJq:程序员不该有女朋友
  • momo墨墨momo:niuniu~~~~~
  • 曹真:讲道理简书这个界面真的丑 乱糟糟
  • YwWyW:没有最后一句压根没这么多留言
  • LeeIn:你说的不是废话么 . 谁不是用女朋友喂水果的呢.
    知傲:左还是右
    沙暴送葬:我懂你意思:sunglasses:
    780647dcdf0e::+1: six six six
  • 曾經蠟筆沒有小新:为什么你这种程序员还没有被祭天,还猝不及防的喂我们吃了狗粮
  • 仇志飞:『导航栏返回按钮』设置后,back item title,如何隐藏 ?期待您的回复
  • 梅俊:那么导航栏返回按钮的标题怎么正确隐藏呢?去掉`setBackButtonTitlePositionAdjustment`就会显示标题,不去返回图片就会向下偏移。
    星兴:@梅俊 我也hook设置了这个,但是标题还是在,请问还需要设置哪些吗
    梅俊:@zhao0 多谢。我hook了ViewDidLoad方法实现了。
    - (void)hk_viewDidLoad {
    if (!self.navigationItem.backBarButtonItem) {
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] init];
    }
    [self.navigationItem.backBarButtonItem setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
    [self hk_viewDidLoad];
    }
    知傲:@梅俊 只能在viewController上设置
  • 拿铁加冰:气得我直接一拳砸坏了电脑,你赔我电脑:joy:
  • HoyaWhite:怎一个窝巢了得。。
  • 菊上一枝梅:你女朋友还需要蓝朋友吗
  • 刘祺轩:本来想点赞的,看来最后一句话默默在心中说了句:滚。
  • selice:程序员不该有女朋友:sweat:
  • fe47b732e8ba:// self.navigationBar.backIndicatorImage = backButtonImage;
    // self.navigationBar.backIndicatorTransitionMaskImage = backButtonImage;
    这两句好像没用啊
    知傲:这两句是设置返回按钮箭头的
    d020a628f1b8:同样的问题,你解决了吗?
    姜流儿96:我也遇到这个了,你解决了吗
  • 开发者头条_程序员必装的App:感谢分享!已推荐到《开发者头条》:https://toutiao.io/posts/6nss64 欢迎点赞支持!
    欢迎订阅《iOS开发笔记》https://toutiao.io/subjects/137534
  • 狗娃_:左姑娘还是右姑娘啊
  • ce4c10d6271a:我想要 那三个点,点击完之后出来那个“收藏、分享。。。”的代码
    知傲:@名字什么的不重要 你可以上网搜这个
    ce4c10d6271a:@zhao0 那就没意思了
    知傲:@名字什么的不重要 WYPopverController
  • master_huang:这个automaticallyAdjustsScrollViewInsets被废弃。影响应该挺大的。我记得我写的好多地方都用了
    知傲:@master_huang 一般是隐藏导航栏的时候用了
  • 西贝人立口:最后一句什么鬼?强行被喂了一把狗粮:scream:
  • ETHANAIR:差评,最后竟然秀恩爱,你不是程序员🙄
  • 雨影:@Available(iOS 11.0, *)这个用法很新奇,是不是可以判断是ios11之后的版本呢?
    知傲:@雨影 可以
    雨影:@zhao0 那编译的APP,以前版本的手机可用吗?
    知傲:@雨影 是的,Xcode9开始支持,之前swift也支持#available
  • HAKA:最后一句 真的过分 感觉现在哪都容不下单身狗了:joy:
  • 店长推荐:充气娃娃也会喂水果了啊,科技是第一生产力啊
  • 刘勇虎:最后一句点明了真相:smirk:
  • 2f6633eb6ca7:最后一句不能忍:cold_sweat:
  • 何何何欣宇:一定是假的程序员
  • woitaylor:这狗粮喂得
  • 1fb7ddd1ede3:写的不错,尤其最后一句
  • 咖啡豆8888:猝不及防的一把狗粮,把我喂饱了
  • 庄深沉:我可以说我在文章里看到了我自己吗?
    知傲:@庄深沉 :joy:
  • kinmo:卧槽,最后一句过分了
  • 雨三楼:花式秀:joy:
  • 且行且珍惜_iOS:被秀了一脸😀,,,可以转摘你的文章到我的公众号吗?
    且行且珍惜_iOS:@zhao0 好的
    知傲:@且行且珍惜_iOS 注明出处就行
    且行且珍惜_iOS:微信公众号 iOS2679114653
  • 429350857997:作为单身狗,有句mmp不知当讲不当讲。
  • 6ec609407e59:拒绝虐狗……程序员不应该有女朋友(。•́︿•̀。)
  • 1560c6a4632f:猝不及防,最后被喂了一把狗粮:dog:
    杜维欣:@okerivy 6
    HunterDude:@okerivy 叼。:joy:
    okerivy:充气娃娃这么智能了啊?哪里买的, 求链接:yum:
  • MJGA:被秀一脸啊
    zhangferry:哇,无处不在的简叔:smile:
    知傲:@简叔 哈哈
  • lsx121t:哈哈哈 赞一个

本文标题:简书App适配iOS 11

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