iOS 11 的 UIKit 变化

WWDC 2017 大会中发布了 iOS 11,在带来了一系列炫酷的框架之后,对 UIKit 也进行了一定程度的更新,这其中有几十项 API 更新或新增,让我们来看一些比较好玩的吧!
本篇只是不完全统计,但将持续更新,最完整的统计和解释请前往【Apple Developer Sites】

新增:Drag and Drop

拖与拽这个功能大家应该都不陌生,这是在移动设备上移动文件或文字最好的解决方案,比普通的粘贴复制更具表达性、易读性和便捷性,而 Apple 经过了长时间锤炼将该功能添加到 UIKit 大家族中来,让它有了无与伦比的 Multi-touch 体验,关于 Drag and Drop 更多的解释请前往我的【Drag and Drop】。

新增:Large Title

只要您安装了 iOS 11 beta,就一定会发现系统内建应用在 UI 设计上有了非常大的改变,其中最为惹人注目的就是 “大标题”,也就是 large title,它看起来就像这样:

iOS 设置 应用

不得不说,这确实增加了可读性,官方的解释是,这强调了用户现在正处于某个多级导航的根部,例如您现在有一个 Navigation Controller,您可以在根视图使用 large title,而如果您的 Tabbar Controller 类似于系统的时钟应用,子标签没有多级导航,那么您或许不应该使用 large title,因为这将误导用户使其以为还有某个地方可以进入下一级导航。

该功能是一系列 API 组合使用的结果,使用也很简单:
1.首先你得有一个 Navigation Controller
2.在导航控制器的根视图控制器下(例如 UITableView Controller)的 viewDidLoad 处,添加代码:

/** language: Swift 4 */
// 设置导航控制器的 navigationBar 的 largeTitle 可用
self.navigationController?.navigationBar.prefersLargeTitles = true

// 设置 largeTitle 的显示方式为自动
self.navigationItem.largeTitleDisplayMode = .automatic

// 设置标题内容
self.navigationItem.title = "Title"

现在运行您的项目,如果正常的话,您的导航栏应该就有了 large title 效果,就像这样:

Large Title

如果失败了,不要灰心,请细心检查您的控制器或其它属性是否设置正确。
同时这也会让所有 Navigation Controller 的子目录均显示大标题,而如果您想(您应该)让子目录不显示大标题,需要在子目录的视图控制器下单独设置:

self.navigationItem.largeTitleDisplayMode = .never

largeTitleDisplayMode 是一个 UINavigationItem 的 LargeTitleDisplayMode 枚举变量,它有如下值:

  • automatic:系统自动决定是否显示大标题,在显示与不显示之间将有很棒的动画过度,效果预览可参照 设置 应用。
  • always:时刻显示大标题
  • never:不显示大标题

新增:additionalSafeAreaInsets

使用这个属性可以给您的内容增加一片 “安全区”,这个安全区有点类似于视图保护,它可以保证您的 tableView、scrollView 等滑动视图中的内容不会显示在您设置的安全区内。
比如我们直接在 ViewController 里添加一个 tableView,第一行一定会和 status bar 有重合,我们不希望这样,所以我们可以:

/** file: ViewController.swift */
override func viewDidLoad() {
        self.additionalSafeAreaInsets = UIEdgeInsetsMake(20, 0, 0, 0)
}

这会让 tableView 的顶部出现一片高度为 20 的空白区域。

安全区和 contentInset 的区别
安全区可以让该控制器的所有类似 tableView 的视图都适用,contentInset 虽然可以实现相同效果但必须一个一个去设置。

同时我们也有了 func viewSafeAreaInsetsDidChange() 方法,它会在安全区被改变时调用。

新增:func preferredScreenEdgesDeferringSystemGestures() -> UIRectEdge

通常,屏幕边缘的手势动作(Screen Edge Gesture)是由系统管理的,没有一个 API 能直接将这些手势拿出来编辑,但如果您想创造一个沉浸式 App 体验,例如视频、游戏等,想要防止 Control Center 或 Notification Center 直接被手势调出,同时让自己的 Gesture 优先被调用,就可以给这个方法提供一个返回值,它表示指定一处边缘让此处的自定义 Gesture 优先于系统的 Gesture:

override func preferredScreenEdgesDeferringSystemGestures() -> UIRectEdge {
        return UIRectEdge.all
}

UIRectEdge 是一个结构体,它有一些属性可以被使用:

public static var top: UIRectEdge { get }
public static var left: UIRectEdge { get }
public static var bottom: UIRectEdge { get }
public static var right: UIRectEdge { get }
public static var all: UIRectEdge { get }

它们都是静态的,所以使用相对简单,现在我们来看看使用该方法的效果:

可以看到,我们已经不能直接滑动出控制中心了,而是有一个小箭头,这是什么意思大家应该都懂吧~
但是通知中心并没有类似效果,不只是 Bug 还是其它的问题,在以后的 beta 版中我会持续测试。

改动:UIViewPropertyAnimator

UIViewPropertyAnimator 是 Apple 在 iOS 10 推出的视图动画类,它可以更方便的创建属性动画,你可以自定义动画曲线来控制动画的播放速度。
在 iOS 11 中,这个类又新增了两个属性,分别是:

var scrubsLinearly: Bool
var pausesOnCompletion: Bool

scrubsLinearly 属性默认是 true,它令您的动画在被用手指拖动时(如果您的动画允许这样做的话)或其它因素影响时,当影响因素停止时,动画剩余的部分将用线型曲线去播放。而若是设置为 false,动画剩余的部分依然由指定的动画曲线播放。

过期的属性

这些属性在 iOS 11 中不建议使用或已过期:

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

推荐阅读更多精彩内容