UIKit 新特性 - WWDC22
type
status
date
slug
summary
tags
category
icon
password
相关 Session
强化生产力
改进了导航栏类型
在 iOS16 中,为了更好的适应 iPadOS 中桌面类型的应用
desktop-class
,UIKit 引入了两种新的导航栏风格。- Browser 用于浏览的导航栏。
- Editor 用于编辑的导航栏。 新的 navigationBarItem 可以支持拖动排序,类似于 mac 上的工具栏。 同时新增了一个标题菜单,和新的导航栏样式一起工作,并且支持一些标准功能,复制,移动,重命名等。只需要实现协议就可以直接展示在菜单中,也可以自定义显示的内容。
查找和替换文本
在 iOS16 中,我们只需要设置一个属性,就可以支持全局文本的查找和替换,在不同的应用程序之间一致的修改文本。支持的控件有
UITextView
, WkWebView
等。编辑菜单重大更新
选中文本的编辑菜单现在得到了更新,样式和交互体验更优秀。为了让不同平台上的体验更统一,现在引入了
UIEditMenuInteractive
用来替代 UIMenuController
。新版本中 UIMenuController
被标记为废弃。这里具体的信息可以在 Adopt desktop-class editing interactions 查看。以上这些是针对生产力进行的更新,这个 session 并没有说的很详细,想要了解具体实现方案,参考:
UI 控件增强
UICalendarView 新的日历控件
新的日历控件支持日期的单选和多选,可以进行标记和设置是否可选,相对于之前的日期选择控件,多了一些自定义,更加的灵活了。需要注意的是在创建 UICalendarView 的时候需要指定日期类型,比如公历。
对每一个日期样式的定制,有一点需要注意下,customView 不允许交互,并且在指定的区域内展示,超出的会被裁切:
UIPageControl 增强
UIPageControl 现在支持展示不同的排列方向了,横向竖向,从左到右从右到左。并且可以自定义图片了 (早该支持了)。
剪贴板隐私优化
在 iOS15 的时候,增加了剪贴板获取时的横幅通知,在 iOS16 上,这个逻辑再次调整了,现在变成了一个弹窗提示,而不是横幅提示,需要用户允许,应用才可以获取剪贴板的内容。为了优化用户的体验,我们可以使用新的系统控件
UIPasteControl
,外观和行为类似于 button,点击之后获取剪贴板数据。API 完善
UISheetPresentationController 增强
现在可以指定 sheet 的高度和百分比了,不过这些第三方库早就实现了,苹果做的也太慢了点,从 iOS16开始算起,至少还要两年才能用上。
SF Symbols 新特性
现在系统提供的 SF Symbols 图标支持四种呈现模式,单色
Monochrome
,多色 multicolor
,分层hierarchical
,调色 palette
。在 iOS15 中,默认使用单色模式渲染,现在 iOS16 中,如果不指定渲染模式的话,不同的符号有不同的呈现方式,例如一些设备图标,会默认使用分层模式呈现。同时我们也可以自己指定不同的渲染模式。
UIImage.SymbolConfiguration.preferringMonochrome()
UIKit 也增加了对于可变符号的支持,允许 app 根据从 0 到 1 动态的呈现符号的变化。
现在也支持我们自己定义可变符号。可以在 Adopt Variable Color in SF Symbols和What's new in SF Symbols 4了解更多。
Stage Manager
在 iOS16上,应用默认支持台前调度。如果使用了旧版本的 UIScreen API,我们还需要进行适配。现在不能假定应用运行在主屏幕上,应该用 UIScene API。
现在
UICollectionView
和 UITableView
多了一个属性,selfSizingInvalidation
单元格大小自适应,默认开启,当可见的单元格内内容发生变化的时候,cell 将会自动调整大小适应内容显示。
它的工作原理如下: 当启用 selfSizingInvalidation
时,单元格可以通过其包含的集合或表视图请求调整大小。
如果使用 UIListContentConfiguration
配置单元格,则自适应将在单元格的配置更改时自动发生。对于任何其他情况,可以调用 cell
或其 contentView
上的 ValidateintrinsicContentSize
方法来调整单元格的大小。默认情况下,单元格将使用动画来调整大小,但是我们可以在 PerformWithoutAnimation
中包装对 validateintrinsicContentSize
的调用,可以关闭动画。使用 swiftUI 来构建 cell
现在已经将两个布局框架放在一起使用很简单,在 iOS16 中,我们有一种全新的方式让 swiftUI 来构建 Cell。
简简单单一句话,就可以做到 UIKit 和 swiftUI 融合,这也太酷了,但是为什么要 iOS16 才能用!
更多的使用方式可以看 Use SwiftUI with UIKit。
UIDevice 废弃的属性
UIDevice. Name 现在不支持返回用户自定义的设备名,只返回通用的设备名。
UIDevice. Orientation 现在不支持了,使用 UIViewController 的 API,比如
preferredInterfaceOrientation
来获取界面方向。- Giscus