大多数浏览器和
Developer App 均支持流媒体播放。
-
UIKit 中的新功能
敬请探索 UIKit 的最新更新和改进并了解如何构建更棒的 iPadOS、iOS 和 Mac Catalyst app。我们将带您了解 UI 改进、工作效率更新和 API 增强,并帮助您探索性能改进和安全性与隐私功能。
资源
相关视频
WWDC21
-
下载
欢迎观看在iOS 15中 《UIKit的新特性》 我叫迈克尔 稍后我的同事杰米 将加入我的行列
iOS 15充满了令人惊叹的 新技术和新功能 我们以一些令人兴奋的方式 更新了UIKit 以帮助你采用这些新功能
我和杰米将一起讨论生产力更新 UI改进、API强化 性能改进 以及一些新的安全和隐私功能
生产力是iPadOS的核心 今年也不例外 更新iPad的多任务处理 键盘导航、键盘快捷键 和iPad指针 我就举这几个例子 让我们从简短的演示开始 了解我们如何 更新多任务处理 以将iPad提升到一个新的水平 在邮件中 我们正在使用 新的中心场景多任务处理功能 来使其比以往任何时候 都更容易专注于单个消息
只需长按信息即可打开 上下文菜单并选择 “在新窗口中打开” 这将在屏幕中央的 UIWindowScene 之中打开消息 这是专注于手头任务的好方法 新的中心窗口场景 也可以通过拖放移动到拆分视图 或通过选择新的拆分视图选项 窗口场景顶部的多任务菜单
或者 你可以在 多任务菜单上向下滑动 并将场景停靠在新的窗架中
将此功能添加到你的应用程序 就像创建一个新的窗口场景 激活操作一样简单 此操作采用返回激活配置的闭包 该配置使用 NSUserActivity创建 可以由你的应用程序处理 将此操作添加到 上下文菜单中 一切就绪
在iPadOS 13.4中 我们引入了妙控键盘 和指针 在iPadOS 15中 我们通过添加波段选择 改进了指针支持 除了提供新的API 我们默认启用波段选择 用于支持多选的 UICollectionView 我们还添加了指针附件 可让你 传达额外的上下文或提示功能 通过将辅助形状 与任何指针样式相结合 可以一次显示多个配件 并围绕指针放置 它们与指针具有相同的流动性 并且系统在不同的配件形状 和位置之间无缝动画
在iPadOS 15中 我们完全重新设计了键盘快捷键菜单 通过分类快捷方式和内置搜索 找到你正在寻找的快捷方式 从未如此简单 新的键盘快捷菜单还提高了 iPad 和Mac Catalyst 版本之间的对等性
为了充分利用这些新功能 你需要采用UIMenuBuilder 实现buildMenuWithBuilder 在你的 UIApplicationDelegate 上 将命令分配给预定义的类别之一 例如“查看”或“文件” 甚至创建你自己的自定义类别 要使用类别 你需要审核你的应用程序 以用于UIResponder keyCommands属性的使用 移动分配给此属性的任何命令 到buildMenuWithBuilder函数 要了解有关多任务处理、iPad 指针和新键盘快捷键菜单的更多信息 我们有个精彩的视频 所有关于获取iPad应用程序 到下一个层次 我们还在iPadOS 15中添加了 对基于焦点的键盘导航的丰富支持 如果你已经熟悉tvOS上的 对焦系统 那么你会很高兴知道 它现在也可以在iPadOS中使用 事实上 tvOS 中的所有焦点导航 CarPlay、iPadOS 和Mac Catalyst 现在都基于 UIFocusSystem 构建 在iPad 和mac Catalyst上 使用UIFocusSystem 方向键用于在焦点项目之间移动 以及Tab键用于在焦点小组 之间移动 在本例中 邮件应用程序使用 带有侧边栏的 UISplitViewController 当使用这些标准UIKit 组件时 iPadOS 15中将默认启用 演示的键盘导航 请查看《专注于键盘导航》 了解有关支持键盘导航的更多信息 在你的应用程序中 iOS的另一个重要生产力功能 是多点触控拖放 iOS 11中引入的拖放功能 已成为一种必不可少的 生产力强化功能 只需一个简单的手势 你就可以在应用程序内 和iPadOS上 甚至应用程序之间 无缝移动数据 在iOS 15中 UIKit已启用 也可以在iPhone上 进行应用间拖放 解锁许多令人兴奋的新互动
例如 现在比以往任何时候 都更容易快速 与朋友分享新表带的想法 只需一个手势 你就可以将 Safari中的照片 直接拖到信息对话中
拖放API未更改以支持 此扩展功能 为了更新技术细节 我们有四个 来自2017年的精彩视频 来让你深入了解如何利用拖放功能 接下来 我将向你展示 iOS 15中的 一些UI改进 我们改进了UIToolbar 和UITabBar的外观 当滚动到底部时 这种更新的外观 会移除背景材料 为你的内容提供更多视觉清晰度 在UITabBar中 我们强化了 对SF Symbols的支持 在使用你喜欢的任何符号时 都能提供出色的效果 虽然UIKit尽最大努力 使你的应用程序中的 这种新外观无缝 你可能会遇到一些问题 你应该审核你可能将 栏的半透明属性设置为false的 地方的代码 并检查是否有任何 UIViewControllers 具有非标准的 edgesForExtendedLayout 这两种情况都会导致 新外观出现视觉问题
如果新的默认行为 不适合你的应用 只需创建一个自定义外观并分配它 到栏上的 scrollEdgeAppearance属性 此属性以前仅可用在 UINavigationBar上 但现在也可用在 UIToolbar和UITabBar上 设置自定义外观 将避免任何由前面提到的 不兼容API 引起的视觉问题
此外 UIKit可能不会 能够推断出适当的滚动视图进行观察 执行新的滚动边缘外观过渡时 要直接指定滚动视图 我们在UIViewController 上添加了一个新函数 setContentScrollView为边缘 看看你所有的滑动杆 确保外观符合你的预期 一定要检查你做过某事的地方 特别是…它可能需要额外的关注
我们在iOS 15 中有一个新的标题外观 对于普通列表 部分标题现在可以 根据内容无缝显示 并且仅在向下滚动时固定到顶部时 才显示可见的背景材料 此外 还插入了新的填充 在每个部分标题上方 使用这种新设计 在视觉上分隔各个部分
当列表内容很长时 你应该将此简单样式 与索引栏结合使用以进行快速清理 如“电话簿”应用中所示
UIKit还提供了分组样式 这适用于不包含大量自定义 或视觉丰富内容的UI 这是配置UI或注册流程的 绝佳选择 类似于你在 “设置”应用中所发现的
突出的标题样式与iPad上 用于侧边栏列表的 现有侧边栏标题样式非常相似 在将.sidebar列表调整为 .insetGrouped列表时 在一个紧凑的尺寸等级中 突出的标题是个好选择
时钟应用中的闹钟标签 充分利用了这种新风格 最后 我们有一个 新的额外突出的分组样式 用于视觉丰富的内容 以便标题保持层次结构 并避免丢失
查看Watch应用的表面艺廊 以了解这种风格的实际效果 要访问所有这些出色的标题样式 请使用在iOS 14中引入的 UIListContent Configuration API 在iOS 14.5中我们引入了 UIListSeparatorConfiguration 允许完全控制列表中的分隔符 你可以为整个列表指定配置 或者你可以覆盖系统生成的外观 以每行为基础 让你完全控制分隔符 iOS 15中的面板能够只覆盖 一半的屏幕显示在我们所谓的 中等高度的detent 有了这个新的半高功能 你可以选择禁用此detent 后面的调光 创造非模态体验 允许在面板内和面板后进行交互 请看《在 UIKit中 自定义和调整面板大小》 了解我们在iOS 15中 强化面板的所有方式
接下来是UIDatePicker 是的 在iOS 15中 我们重新引入了时间之轮 但是现在 你只需点击时间 即可使用键盘进行输入 有了iPad上的妙控键盘 你甚至可以直接连续编辑时间 当然 你仍然可以点按屏幕 来显示那些漂亮的控制轮 说到这里 我这就交给我的同事杰米 谢谢 迈克尔! 我将开始研究iOS 15中 UIKit API的更多强化功能 我们的第一个API强化 在很多方面也是UI的改进 我们为UIButton添加了新的API 允许你灵活配置按钮的外观和感觉
除了现有的素色样式 我们还添加了灰色 也就是灰色背景 有色 也就是有色背景 和填充 也就是完全不透明
除了新样式 按钮现在更好地支持 调整大小以响应系统 “文本大小”设置 也就是所谓的动态字体 第一次正式支持多行文本 这些更改 以及启用它们的 新的UIButton.Configuration的API 不仅仅是让按钮更强大 它们也更加可定制且易于更新
连同对iOS 14中的按钮上 所发布的UIMenu附加组件 UIButtonConfiguration 第一次允许你制作弹窗 和在UIKit中原生的下拉按钮
当然 如果你在Mac上使用UIKit 并且你在Xcode中选择了 “优化Mac上的界面” 这些按钮的外观和行为 都与你期望的一样
下面是API的易用性范例 只需创建一个按钮配置 此建构子提供了有色样式
配置的属性 会被使用于自定义按钮 然后实例化按钮 传入配置 这里没有显示 但剩下要做的事情就是 添加一个动作 并将按钮添加到你的视图中 关于UIButtonConfiguration 我在这能讲的有限 所以另有完整视频讲解 以及对UIButton其他改进的 详细说明 请看《认识UIKit按钮系统》 了解有关按钮API的所有信息 iOS和iPadOS上的 UIContextMenuInteraction 现在支持可折叠子菜单 当你点击带有V形符号的任何项目 例如此菜单中的“排序依据”项目时 它们就会出现
这里没有针对此的新API UIMenu API已经支持子菜单 但在iOS 15之前 在你点击它们时 当前的菜单被他们完全替换了 这同时也在以下视频 《认识UIKit按钮系统》 有稍微讨论到过
在iOS 13中 我们引入了 SF Symbols… 数百个可缩放的符号 在我们的旧金山字体旁边看起来很棒 在iOS 15中 这些变得更好了 不仅有额外的符号 而且我们还增加了 以三种新方式使用颜色的能力: 分层、调色板和多色 单色符号是你已经知道并爱上了的 单色的可着色图像 分层符号会将单个运行时 指定的色调颜色 应用至层的层次结构 调色板符号允许 明确指定多种颜色 以及以前仅在AppKit和 SwiftUI中可用的多色符号 有固定的多色表示
UIKit、SwiftUI和AppKit中提供了 用于使用所有 这些多彩模式的新API
这些API非常易于使用 此代码设置了 UIImageSymbolConfiguration 以使用系统橙色 作为分层着色的基础 然后使用它来创建分层着色的 橙色太阳符号的图像
如果你经常使用SFSymbols 你就会知道它们有几种样式变体 例如 填充、圆形或矩形
在以前的版本中 这些是通过 指定带点的字符串来选择的 在iOS 15中 有一个 新的UIImage API 让使用这些变体变得非常容易 不管是否要预先指定类型 或生成现有图像的变体 这是由“心”字符串 及其两个变体表示的符号 现在可以在代码中选择
在《设计和创建SF Symbols》视频集中 有很多关于SF Symbols 各方面的解说 我鼓励你全部观看
在《UIKit和AppKit中的SF Symbols》 有更多关于UIKit API的内容
UIContentSizeCategory 特征代表了系统文本 大小设置…也称为在代码中的 动态类型大小 你可以设置标签、文本字段、文本视图 和图像视图… 可能包含SFSymbols… 来自动调整到设置 在iOS 15中 我们添加了 一种新方法来限制 如何将特征应用于视图层次结构 这使你可以轻松地为该尺寸 设置地板或天花板 当你确保应用的文本和图像 在每个文本大小设置下 看起来都很棒时 这会很有帮助 在这里 Clock限制了 它的大时间标签变得有多小
请不要使用此API来 过度限制文本大小 这些设置具有极其重要的功能 最重要的是 你的应用程序的 所有功能都可用 并且对使用最高文本大小 设置的人来说 一切都清晰易读 再举一个例子 你可以使用它 来限制在默认大小下 已经非常大的标题的增长
我们统一了所有平台的系统颜色 这对UIKit意味着什么? 嗯 有些颜色有一些微妙的变化 和一些以前 只在其他框架中可用的颜色 现在无论你的应用程序 在哪里运行 都能在UIKit中使用 所以如果你一直渴望在你的 UIKit应用程序中 使用systemMint 或systemBrown 现在是时候了
同样新的是UIColor.tintColor 它是一种在运行时解析的颜色 基于应用程序 或特征层次结构的当前色调颜色 它非常适合与新的 UIButton.Configuration 和新的彩色SF Symbols API 一起使用
除了UIColor 还有对UIColorPicker ViewController的强化 混合和挑选颜色的标准界面 在iOS 14.5中 有一个新的回调 colorPickerViewController (didSelect:continuously:) 这允许在混合和更改颜色 以及完成挑选时 更新应用程序UI TextKit 2是新的 下一代文本布局系统 适用于iOS、iPadOS tvOS和macOS 这是一个功能强大的新系统 可以更轻松地表达 你想用文本做的事情 它以一种快速、高性能的方式完成 UIKit在幕后采用了它来为 UITextField提供支持 为文本带来更好的布局 例如卡纳达语 这种具有复杂字迹的语言 连采用都不需要
如果你想了解有关TextKit 2的更多信息 它可以做什么 以及如何在你的应用中使用它 请观看《认识TextKit 2》
UISceneSession 表示应用程序UI的一个实例 并对应于应用程序切换器中表示的 应用程序窗口 NSUserActivity则表示接口状态 当场景进入后台时 你的应用程序会将这个 NSUserActivity 提供给系统 并且应该在场景重新实例化时 使用它来恢复界面状态 在iPadOS 15中 有些新的API会使这更容易 有一种新方法可以获取 和设置我们的文本输入视图的瞬态 还有一个新的UIScene回调能提供 一个更方便的地方 来在故事板加载后恢复状态 并且有机会在你的应用程序的UI 变为活动状态时延长应用程序 启动过程和延迟 如果你有返回状态的 异步模型代码的话 我们所有的工程工作都集中在基于 UIScene的API上 如果你仍在使用 在iPadOS 13引入UIScene之前 基于UIApplication的 旧生命周期 该来切换到UIScene了 所有UIKit应用程序都可以使用它 且不一定要能支持多个窗口 但对于iPad和Mac应用程序来说 这是一个好主意
有关UIScene的复习 以及更多有关强化状态 恢复API的详细信息 请看《让你的iPad 应用更上层楼》 说到场景 在iOS 15的UIKit中 有新的API可以让app代表 当前在每个场景中 与之交互的可共享内容 它们被iOS和Mac上的 新Siri“ShareThis”功能 以及NSSharingService PickerToolbarItem 在Mac Catalyst上都有使用 在《为快捷方式、Siri和建议 设计出色的操作》 和《出色的 Mac Catalyst 应用程序的质量》视频有详细介绍
对于我们最后的API强化 我们将交回给我们亲爱的朋友们 UICollectionView和UITableView 在iOS 14中 我们引入了新的API 让你可以比过去更轻松、更一致地 配置单元格的外观和风格
在iOS 15中 新的基于闭包的更新处理程序 使重新配置单元 比以往任何时候都更容易
你不再需要创建单元子类 并使用state来覆盖 updateConfiguration: 你现在可以在创建单元格的 同一位置内联编写该代码 在这里 当单元格被禁用时 我们会将文本变灰 类似且基于闭包的函数 在新的UIButtonConfiguration API内 也是可以取用的
我们改进了差异数据源 以便更轻松地 更新你的集合和表视图 在iOS 15中 当你在没有 动画差异的情况下应用快照时 UI会根据这些更改进行更新 而不会丢弃现有单元格 这里还有新的API可以 有效地重新配置项目 因此你可以在项目的属性 发生变化但不改变它们的识别时 更新现有单元格中显示的内容
UIKit运行的每个设备 都有多个处理器内核 和强大的图形硬件 一切应该很快就要完成 动画和滚动应该始终流畅 在iOS 15中 有一些强化功能和新的API 使构建具有这些特性的应用程序 变得更加容易 让我们来谈谈UIKit之中 可用的一些吧 首先 我们将回到UICollectionView 和UITableView iOS 15引入了对单元格预取的更改 当你为iOS 15构建时 这些更改会自动生效 他们可以给应用最多两倍的时间… 几乎两个视觉框架的价值… 在保持滚动完美平滑的同时 准备单元格
许多单元格都会显示图像 过去你可能已经注意到 当主UI队列忙于解码大图像时 滚动会出现短暂中断
在iOS 15中 应用程序代码 可以更好地控制这个过程 有新的简单功能可以准备图像 以便在你的应用程序 需要显示它们时完全准备好 而且这些函数很容易异步使用 因此UI队列可以在 解码图像时自由处理事件
许多应用程序处理大图像 但以小尺寸显示它们 为了帮助解决这个问题 有新的UIImage APIs 更有效地调整图像大小 并通过使用系统 关于图像和显示的知识 来节省内存
有关这些集合视图 和图像改进的更多详细信息 有关如何利用它们 及其他一些 很棒的性能技巧 请参阅《快速创建列表和集合视图》
Swift引入了新功能 这使得编写异步代码比以往更容易 大多数UIKit API 必须在主UI队列上调用 我们已经将这些API注释为 主要演员以确保 这是第一次在编译时强制执行 在其他方面 比如新的 UIImage准备功能 我们使用新的异步 Swift语言功能 调整了API以确保 UIKit易于使用且安全 请看《认识Swift中的async/await》 和《认识AsyncSequence》 来开始使用这种 开发异步代码的新方法
现在 来说安全和隐私 我们在iOS 15中 内置了一些新技术 允许系统验证真正与哪个界面交互
我们已经在几个地方 将它集成到UIKit中 在这里 我将讨论可能 影响你的应用程序的三个
首先 位置按钮 iOS 15引入了一个新的API 允许应用程序嵌入按案例授予的按钮 一次性访问设备的当前位置 他们会在…也仅有在 被点击时才这样做 没有大量的警报或提示
API很灵活 因此它可以 匹配每个应用程序的外观 但在幕后 它确保按钮始终清晰易读 否则他们将无法工作 有个完整的视频讨论 如何将其嵌入到任何应用中 叫做《认识位置按钮》
我相信你已经注意到这个横幅 它是在iOS 14中引入的 当应用程序访问复制到 不同应用程序中的 粘贴板上的数据时显示
在iOS 15中 我们将在系统 可以确认的任何时候消除横幅 数据是在与标准系统粘贴界面 有意交互后访问的 例如 点击编辑菜单中的粘贴按钮 或硬件键盘上的Cmd-V
我们还添加了API 以提供一些新的标准粘贴菜单项 使用这些时 也不会显示通知横幅 我们提供了新的方法来指定“粘贴” “粘贴即行” “粘贴和搜索” 和“粘贴和匹配样式” 对于每一个 都有标准的 UIResponder选择器… 用于UIMenuController和UICommand… 和新标识符 用于UIAction
有时候 应用程序需要有关 粘贴板上内容的更多信息 但不需要完全访问权限 在iOS 14中 我们引入了一个API 应用程序 来检查粘贴板上是否有数字 可能的Web URL 或可能的Web搜索词 我们自己在Calculator 和Safari中就使用这些
在iOS 15中 此API已大大扩展 以涵盖所有标准数据检测器类型 这些都不会显示通知 因为它们不授予 对数据本身的访问权限 还有一些API可以在 无需解析的情况下 亲自检索数据值文本 虽然如果 这些API在使用标准粘贴接口 之后的任何时间使用 系统都会显示粘贴通知
我们上一次的隐私强化 是iOS 14.5中的新功能 它建立在支持位置和粘贴界面的 技术的早期版本之上 UIEventAttribution 是与WebKit团队共同开发的 WebKit的私人点击测量功能 提供了网络到网络点击测量 UIEventAttribution将PCM引入UIKit 并提供App-to-Web点击测量 这意味着对广告点击 和点击的隐私保护衡量 它易于使用 只需使用 UIEventAttributionViews覆盖广告 并将UIEventAttribution对象 与你打开以响应广告点击的 任何URL一起传递
要了解更多信息 请参阅 《符合隐私保护的广告属性》视频 还有一篇很棒的WebKit.org 博客文章 标题为 《私人点击数衡量概论》 嗯 时间过得真快 我们甚至没有讲解完所有新内容 接下来是什么? 请使用iOS 15 SDK 编译你的应用程序 测试iPhone上的拖放 和我们强化的系统颜色等新功能 采用带有新按钮、栏、列表和符号的 新iOS 15外观 采用我们新的iPad功能 以获得更好的多任务处理 键盘和触控板支持 并使用新的UIKit API 来尊重用户隐私 并更轻松地制作更好 更快的应用程序 谢谢你
-
-
1:41 - Building an "Open in New Window" action
// Building an "Open in New Window" action let newSceneAction = UIWindowScene.ActivationAction({ _ in // Create the user activity that represents the new scene content let userActivity = NSUserActivity(activityType: "com.myapp.detailscene") // Return the activation configuration return UIWindowScene.ActivationConfiguration(userActivity: userActivity) })
-
3:06 - UIMenuBuilder
class AppDelegate: UIResponder, UIApplicationDelegate { override func buildMenu(with builder: UIMenuBuilder) { // Use the builder to modify the main menu... } }
-
6:26 - UIBarAppearance
let appearance = UITabBarAppearance() appearance.backgroundEffect = nil appearance.backgroundColor = .blue tabBar.scrollEdgeAppearance = appearance let scrollView = ... // Content scroll view in your app viewController.setContentScrollView(scrollView, for: .bottom)
-
11:31 - Creating a button with UIButton.Configuration
// Creating a button with UIButton.Configuration var config = UIButton.Configuration.tinted() config.title = "Add to Cart" config.image = UIImage(systemName: "cart.badge.plus") config.imagePlacement = .trailing config.buttonSize = .large config.cornerStyle = .capsule self.addToCartButton = UIButton(configuration: config)
-
13:30 - Using a hierarchical color symbol
// Using a hierarchical color symbol let configuration = UIImage.SymbolConfiguration( hierarchicalColor: UIColor.systemOrange ) let image = UIImage( systemName: "sun.max.circle.fill", withConfiguration: configuration )
-
19:30 - New UICollectionViewCell.configurationUpdateHandler closures
// New UICollectionViewCell.configurationUpdateHandler closures let cell: UICollectionViewCell = ... cell.configurationUpdateHandler = { cell, state in var content = UIListContentConfiguration.cell().updated(for: state) content.text = "Hello world!" if state.isDisabled { content.textProperties.color = .systemGray } cell.contentConfiguration = content }
-
21:01 - Image display preparation
// Image display preparation if let image = UIImage(contentsOfFile: pathToImage) { // Prepare the image for display asynchronously. Task { let preparedImage = await image.byPreparingForDisplay() imageView.image = preparedImage } }
-
21:29 - Image thumbnailing
// Image thumbnailing if let bigImage = UIImage(contentsOfFile: pathToBigImage) { // Prepare the thumbnail asynchronously. Task { let smallImage = await bigImage.byPreparingThumbnail(ofSize: smallSize) imageView.image = smallImage } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。