你可能须要为你的APP适配iOS11

WeTest 导读ios

 iOS 11 为整个生态系统的 UI 元素带来了一种更加大胆、动态的新风格。 本文介绍了iOS11在UI方面作了哪些更新,有些更新能够为用户提供更加完美的体验,但也有的可能会给目前的APP带来异常bug。

前言

前几天发如今作的APP在iOS11系统上动画有异常,在其余系统的设备上都是正常的,动画的操做是观察tableView的contentOffset变化后执行的,异常动画发生在tableView reloadData以后,也就是说tableView reloadData以后,tableView的contentOffset发生了几回变化。查了下资料发现缘由是iOS11中默认开启了Self-Sizing,在WWDC 2017 session204 Updating Your App for iOS 11 中有介绍,所以研究了下这个session,本文做为一个总结,下文的第三部分会有对上述的动画异常的缘由分析及解决方式。数组

 

本文内容包括:集成了搜索的大标题栏、横向选项卡栏、Margins 和 Insets以及 UIScrollView和UITableView 的更新和功能更强大的滑动操做。缓存

 

1、在UIKit’s Bars中加入的新功能安全

WWDC经过iOS新增的文件管理App:Files开始介绍,在Files这个APP中可以看到iOS11中UIKit’s Bars的一些新特性:在浏览功能上的大标题视图(向上滑动后标题会回到原来的UI效果)、横屏状态下tab上的文字和icon会变为左右排列。我用iOS11的模拟器体验了一下Files这个APP的竖屏和横屏,以下图所示:session

(command+向左的箭头让模拟器横屏)ide

 

横屏时,在iPhone上,tab上的图标较小,tab bar较小,这样垂直空间可多放置内容。若是有人看不清楚tab bar上的图标或文字,能够经过长按tab bar上的任意item,会将该item显示在HUD上,这样能够清楚的看清icon和text。对tool bar 和 navigation bar同理,长按item也会放大显示。以下图显示:工具

 

 

 

一、UIBarItem布局

UIBarItem是UI tab bar item和UI bar button item的父类,要想实现上面介绍的效果,只须要为UIBarItem 设置landscapeImagePhone属性,在storyboard中也支持这个设置,对于HUD的image须要设置另外一个iOS11新增的属性:largeContentSizeImage,关于这部分更详细的讨论,能够参考 WWDC2017 Session 215:What's New in Accessibility学习

 

二、控制大标题的显示测试

在UI navigation bar中新增了一个BOOL属性prefersLargeTitles,将该属性设置为ture,navigation bar就会在整个APP中显示大标题,若是想要在控制不一样页面大标题的显示,能够经过设置当前页面的navigationItem的largeTitleDisplayMode属性;

 

三、Navigation 集成 UISearchController

把你的UISearchController赋值给navigationItem,就能够实现将UISearchController集成到Navigation。

 

四、UINavigationController和滚动交互

滚动的时候,如下交互操做都是由UINavigationController负责调动的:

 

因此,若是你使用navigation bar,组装push和pop体验,你不会获得searchController的集成、大标题的控制更新和Rubber banding效果,由于这些都是由UINavigationController控制的。

 

五、UIToolbar and UINavigationBar— Layout

在 iOS 11 中,当苹果进行全部这些新特性时,也进行了其余的优化,针对 UIToolbar 和 UINavigaBar 作了新的自动布局扩展支持,自定义的bar button items、自定义的title均可以经过layout来表示尺寸。 须要注意的是,你的constraints须要在view内部设置,因此若是你有一个自定义的标题视图,你须要确保任何约束只依赖于标题视图及其任何子视图。当你使用自动布局,系统假设你知道你在作什么。

 

六、Avoiding Zero-Sized Custom Views

自定义视图的size为0是由于你有一些模糊的约束布局。要避免视图尺寸为0,能够从如下方面作:

● UINavigationBar 和 UIToolbar 提供位置

● 开发者则必须提供视图的size,有三种方式: 

① 对宽度和高度的约束;

② 实现 intrinsicContentSize;

③ 经过约束关联你的子视图;

 

2、管理margins 和 insets

一、layout margins

基于约束的Auto Layout,使咱们搭建可以动态响应内部和外部变化的用户界面。Auto Layout为每个view都定义了margin。margin指的是控件显示内容部分的边缘和控件边缘的距离。 能够用layoutMargins或者layoutMarginsGuide属性得到view的margin,margin是视图内部的一部分。layoutMargins容许获取或者设置UIEdgeInsets结构的margin。layoutMarginsGuide则获取到只读的UILayoutGuide对象。

 

在iOS11新增了一个属性:directional layout margins,该属性是NSDirectionalEdgeInsets结构体类型的属性:

 

 

layoutMargins是UIEdgeInsets结构体类型的属性:

 

从上面两种结构体的对比能够看出,NSDirectionalEdgeInsets 属性用leading 和 trailing 取代了以前的 left 和 right。

 

directional layout margins属性的说明以下:

 

例子:当你设置了trailing = 30;当在一个right to left 语言下trailing的值会被设置在view的左边,能够经过layout margins的left属性读出该值。以下图所示:

 

还有其余一些更新。自从引入layout margins,当将一个view添加到viewController时,viewController会修复view的的layoutMargins为UIKit定义的一个值,这些调整对外是封闭的。从iOS11开始,这些再也不是一个固定的值,它们实际是最小值,你能够改变你的view的layoutMargins为任意一个更大的值。并且,viewController新增了一个属性:viewRespectsSystemMinimumLayoutMargins,若是你设置该属性为"false",你就能够改变你的layout margins为任意你想设置的值,包括0,以下图所示:

 

二、安全区域(Safe Area)

以下图:照片应用程序

 

从iOS 7以来,咱们在整个操做系统中都有这些半透明的bars,苹果鼓励咱们经过这些bars绘制内容,咱们是经过viewController 的edgesForExtendedLayout属性来作这些的。 iOS 7 开始,在 UIViewController中引入的 topLayoutGuide和 bottomLayoutGuide 在 iOS 11 中被废弃了,取而代之的就是safeArea的概念,safeArea是描述你的视图部分不被任何内容遮挡的方法。 它提供两种方式:safeAreaInsets或safeAreaLayoutGuide来提供给你safeArea的参照值,即 insets 或者 layout guide。 safeArea区域以下图所示:

 

若是有一个自定义的viewController,你可能要添加你本身的bars,增长safeAreaInsets的值,能够经过一个新的属性:addtionalSafeAreaInsets来改变safeAreaInsets的值,当你的viewController改变了它的safeAreaInsets值时,有两种方式获取到回调:

 

3、UIScrollView and UITableView  的新特性

一、 Scroll Views

若是有一些文本位于UI滚动视图的内部,并包含在导航控制器中,如今通常navigationContollers会传入一个contentInset给其最顶层的viewController的scrollView,在iOS11中进行了一个很大的改变,再也不经过scrollView的contentInset属性了,而是新增了一个属性:adjustedContentInset,下面的两张图的对比可以表示adjustContentInset表示的区域:

 

新增的contentInsetAdjustmentBehavior属性用来配置adjustedContentInset的行为,该结构体有如下几种类型:

 

二、Table Views :在iOS 11中默认启用Self-Sizing

这个应该是UITableView最大的改变。咱们知道在iOS8引入Self-Sizing 以后,咱们能够经过实现estimatedRowHeight相关的属性来展现动态的内容,实现了estimatedRowHeight属性后,获得的初始contenSize是个估算值,是经过estimatedRowHeight x cell的个数获得的,并非最终的contenSize,tableView就不会一次性计算全部的cell的高度了,只会计算当前屏幕可以显示的cell个数再加上几个,滑动时,tableView不停地获得新的cell,更新本身的contenSize,在滑到最后的时候,会获得正确的contenSize。在测试Demo中,建立tableView到显示出来的过程当中,contentSize的计算过程以下图:

 

 

Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells都默认开启Self-Sizing,全部estimated 高度默认值从iOS11以前的 0 改变为UITableViewAutomaticDimension:

 

若是目前项目中没有使用estimateRowHeight属性,在iOS11的环境下就要注意了,由于开启Self-Sizing以后,tableView是使用estimateRowHeight属性的,这样就会形成contentSize和contentOffset值的变化,若是是有动画是观察这两个属性的变化进行的,就会形成动画的异常,由于在估算行高机制下,contentSize的值是一点点地变化更新的,全部cell显示完后才是最终的contentSize值。由于不会缓存正确的行高,tableView reloadData的时候,会从新计算contentSize,就有可能会引发contentOffset的变化。iOS11下不想使用Self-Sizing的话,能够经过如下方式关闭:(前言中提到的问题也是经过这种方式解决的)

 

iOS11下,若是没有设置estimateRowHeight的值,也没有设置rowHeight的值,那contentSize计算初始值是 44 * cell的个数,以下图:rowHeight和estimateRowHeight都是默认值UITableViewAutomaticDimension 而rowNum = 15;则初始contentSize = 44 * 15 = 660;

 

 

三、Table Views:separatorInset 扩展

OS 7 引入separatorInset属性,用以设置 cell 的分割线边距,在 iOS 11 中对其进行了扩展。能够经过新增的UITableViewSeparatorInsetReference枚举类型的separatorInsetReference属性来设置separatorInset属性的参照值。

 

 

下图清晰的展现了这两种参照值的区别:

 

四、Table Views 和 Safe Area

有如下几点须要注意:

● separatorInset 被自动地关联到 safe area insets,所以,默认状况下,表视图的整个内容避免了其根视图控制器的安全区域的插入。

● UITableviewCell 和 UITableViewHeaderFooterView的 content view 在安全区域内;所以你应该始终在 content view 中使用add-subviews操做。

● 全部的 headers 和 footers 都应该使用UITableViewHeaderFooterView,包括 table headers 和 footers、section headers 和 footers。

 

五、滑动操做(Swipe Actions)

在iOS8以后,苹果官方增长了UITableVIew的右滑操做接口,即新增了一个代理方法(tableView: editActionsForRowAtIndexPath:)和一个类(UITableViewRowAction),代理方法返回的是一个数组,咱们能够在这个代理方法中定义所须要的操做按钮(删除、置顶等),这些按钮的类就是UITableViewRowAction。这个类只能定义按钮的显示文字、背景色、和按钮事件。而且返回数组的第一个元素在UITableViewCell的最右侧显示,最后一个元素在最左侧显示。从iOS 11开始有了一些改变,首先是能够给这些按钮添加图片了,而后是若是实现了如下两个iOS 11新增的代理方法,将会取代(tableView: editActionsForRowAtIndexPath:)代理方法:

 

这两个代理方法返回的是UISwipeActionsConfiguration类型的对象,建立该对象及赋值可看下面的代码片断:

 

建立UIContextualAction对象时,UIContextualActionStyle有两种类型,若是是置顶、已读等按钮就使用UIContextualActionStyleNormal类型,delete操做按钮可以使用UIContextualActionStyleDestructive类型,当使用该类型时,若是是右滑操做,一直向右滑动某个cell,会直接执行删除操做,不用再点击删除按钮,这也是一个好玩的更新。

 

滑动操做这里还有一个须要注意的是,当cell高度较小时,会只显示image,不显示title,当cell高度够大时,会同时显示image和title。我写demo测试的时候,由于每一个cell的高度都较小,因此只显示image,而后我增长cell的高度后,就能够同时显示image和title了。见下图对比:

 

总结

大概介绍了iOS 11的UI方面的一些更新,大部份内容都用代码测试过了,有些更新确实是很实用,能够适配下iOS 11,有的更新可能会给现有APP形成bug,因此学习下这些内容仍是颇有必要的。

 

参考:

一、Updating Your App for iOS 11 - WWDC 2017 - Session 204 - iOS

二、iOS 8自动调整UITableView和UICollectionView布局

三、Mysteries of Auto Layout, Part 1 - WWDC2015

四、Mysteries of Auto Layout, Part 2 - WWDC2015

 


 

【腾讯WeTest iOS预审工具】

 

为了提升IEG苹果审核经过率,腾讯专门成立了苹果审核测试团队,打造出iOS预审工具这款产品。通过两年的内部运营,腾讯内部应用的iOS审核经过率从平均35%提高到90%+。

 

现将腾讯内部产品的过审经验共享给各位。在WeTest腾讯质量开放平台上可以使用iOS预审工具点击连接:http://wetest.qq.com/product/ios 咨询体验!

 

若是使用当中有任何疑问,欢迎联系腾讯WeTest        企业QQ:800024531


 

iOS预审服务

【扫描工具】上传IPA包、图片、视频、应用描述便可进行测试; 多维度自动扫描提审材料的被拒风险;1小时内反馈全面的扫描报告。

【专家预审】腾讯专家为您遍历App全部功能模块;全面暴露App内容被拒风险;跟进问题直至上线(需提供官方拒绝邮件)。

【专家咨询】资深预审专家一对一服务; 咨询时间灵活可选,按需购买;有的放矢解 决审核问题。

【ASO优化】专业团队多维度深度剖析App的ASO现状;围绕App目标用户群筛选高 度关联的关键词;帮助提高App在苹果应用商店中的曝光率。

相关文章
相关标签/搜索