e-works数字化企业网  »  文章频道  »  基础信息化  »  移动应用

你可能需要为你的 APP 适配 iOS 11

2017/8/28    来源:腾讯Bugly    作者:佚名      
关键字:APP   iOS 11  
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 的更新和功能更强大的滑动操作。
 
    一. 在UIKit’s Bars中加入的新功能
 
    WWDC通过iOS新增的文件管理App:Files开始介绍,在Files这个APP中能够看到iOS11中UIKit’s Bars的一些新特性:在浏览功能上的大标题视图(向上滑动后标题会回到原来的UI效果)、横屏状态下tab上的文字和icon会变为左右排列。我用iOS11的模拟器体验了一下Files这个APP的竖屏和横屏,如下图所示:
 
(command+向左的箭头让模拟器横屏)
 
    (command+向左的箭头让模拟器横屏)
 
    横屏时,在iPhone上,tab上的图标较小,tab bar较小,这样垂直空间可多放置内容。如果有人看不清楚tab bar上的图标或文字,可以通过长按tab bar上的任意item,会将该item显示在HUD上,这样可以清楚的看清icon和text。对tool bar 和 navigation bar同理,长按item也会放大显示。如下图显示:
 
你可能需要为你的 APP 适配 iOS 11
 
    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属性;
 
    typedef NS_ENUM(NSInteger, UINavigationItemLargeTitleDisplayMode) {
  
    /// 自动模式依赖上一个 item 的特性
  
    UINavigationItemLargeTitleDisplayModeAutomatic,
  
    /// 针对当前 item 总是启用大标题特性
  
    UINavigationItemLargeTitleDisplayModeAlways,
  
    /// Never 
  
    UINavigationItemLargeTitleDisplayModeNever,
 
    }
 
    Navigation 集成 UISearchController
 
    把你的UISearchController赋值给navigationItem,就可以实现将UISearchController集成到Navigation。
 
    navigationItem.searchController  //iOS 11 新增属性
 
    navigationItem.hidesSearchBarWhenScrolling //决定滑动的时候是否隐藏搜索框;iOS 11 新增属性
 
    UINavigationController和滚动交互
 
    滚动的时候,以下交互操作都是由UINavigationController负责调动的:
 
    1.UIsearchController搜索框效果更新
 
    2.大标题效果的控制
 
    3.Rubber banding效果 //当你开始往下拉,大标题会变大来回应那个滚轮
 
    所以,如果你使用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;
 
    通过约束关联你的子视图;
 
    二. 管理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结构体类型的属性:
 
你可能需要为你的 APP 适配 iOS 11
 
    layoutMargins是UIEdgeInsets结构体类型的属性:
 
你可能需要为你的 APP 适配 iOS 11
 
    从上面两种结构体的对比可以看出,NSDirectionalEdgeInsets 属性用leading 和 trailing 取代了之前的 left 和 right。
 
    directional layout margins属性的说明如下:
 
    directionalLayoutMargins.leading is used on the left when the user interface direction is LTR and on the right for RTL.
 
    Vice versa for directionalLayoutMargins.trailing.
 
    例子:当你设置了trailing = 30;当在一个right to left 语言下trailing的值会被设置在view的左边,可以通过layout margins的left属性读出该值。如下图所示:
 
你可能需要为你的 APP 适配 iOS 11
 
    还有其他一些更新。自从引入layout margins,当将一个view添加到viewController时,viewController会修复view的layoutMargins为UIKit定义的一个值,这些调整对外是封闭的。从iOS11开始,这些不再是一个固定的值,它们实际是最小值,你可以改变你的view的layoutMargins为任意一个更大的值。而且,viewController新增了一个属性:viewRespectsSystemMinimumLayoutMargins,如果你设置该属性为”false”,你就可以改变你的layout margins为任意你想设置的值,包括0,如下图所示:
 
你可能需要为你的 APP 适配 iOS 11
 
    安全区域(Safe Area)
 
    如图:照片应用程序
 
你可能需要为你的 APP 适配 iOS 11
 
    从iOS 7以来,我们在整个操作系统中都有这些半透明的bars,苹果鼓励我们通过这些bars绘制内容,我们是通过viewController 的edgesForExtendedLayout属性来做这些的。

责任编辑:李欢
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐