大多数浏览器和
Developer App 均支持流媒体播放。
-
您的键盘布局指南
探讨如何使用键盘布局指南来管理 iOS 或 iPadOS app 内的键盘工作方式。了解在您使用 UIKeyboardLayoutGuide 和 UITrackingLayoutGuide 将键盘集成到您的界面时如何避免写入冗长的代码块,帮助人们在您的 app 中使用屏幕键盘时获得更加顺畅、更加愉悦的体验。为了能充分了解本节内容,我们建议您先熟悉 Auto Layout 和 UILayoutGuide。
资源
相关视频
WWDC23
WWDC21
-
下载
♪ ♪
大家好 我是凯希雅欧沃 是键盘界面团队的工程师 今天 由我担任各位的向导 带领你们畅游键盘布局 我真的很兴奋 今天可以跟各位介绍 如何把键盘从过去以框架为主的方式 带往自动布局的未来 旅程第一站会先介绍新指南 接着会介绍一些新功能 让你能更全面地把键盘整合进布局 最后 我们会说明键盘本身 就哲学上而言 要考虑的键盘种类 以及一些你可能不会马上联想的状况 现在就开始我们的旅程吧 跟很多事一样 一切要从远古时代说起 如果你之前有在app处理过键盘 就知道自古以来处理键盘的方式 是通过登录以获得通知 从通知中的信息 获知适当的偏移和动画 运行一些演算 最后 用那些数据调整你的布局 现在 通知依然存在 我们没有要贬低它们 如果有兴趣的话可以参考 2017年“获得更好文字输入 经验的秘诀”有更多信息 现在看个快速示例 用自定义指南 要如何使用通知 现在 不要复制任何代码 因为我们等一下会取代代码 不过这是iOS 15之前处理键盘的方式 你会创建自己的自定义指南和定位点 以响应通知 接着登录适当的通知 通常至少要有出现和隐藏的指令 不过有时候还会有框架更改等 接着你会通过从通知取得的框架信息 响应上述通知 确保你调整自己的视图 以及安全区域指南 如果键盘离开屏幕的话 然后你会从通知获得动画信息 最后 更改你的指南以相符 现在 没那么难 但是可能很快变得复杂 今天我很开心 可以宣布自动布局集合 会有一个全新的附加功能 界面键盘布局指南 现在 在我们深入之际 先别太兴奋 在iOS 15 键盘布局指南是全新内容 那是一份布局指南 可以在原有的布局中 约束视图与指南 如果你对布局指南不熟悉 布局指南是在布局中 不使用视图来代表空间的一种方式 其定位点与视图完全一样 键盘布局指南会代表 键盘在app中占据的空间 所以可以依此分配布局 就这样! 主要重点都说完了 现在来聊聊更新刚才看到的代码 改用这个 这里是通知的代码 先不要复制 等到出现绿色的勾选符号 好的 现在可以开始了 移除刚才追踪的定位点 从你的布局指南改变成 视图的键盘布局指南
我们就不需要再登录通知 我们也不需要回应它们 就这样 所有代码浓缩成一行 准备好看看实际运行了吗? 这就是使用通知代码 叫出键盘的样子 这是用指南叫出键盘的样子
你可能注意到 除了在地化之外 看起来都一样 但是这就是重点 你不用做那么多事 就能获得一样的结果 接下来就来谈谈怎么更新指南 那是界面视图的属性 大部分情况下 你只要更新到使用指南的 顶端定位点就好 指南会与键盘的动画相符 例如叫出和收起 其也会遵照高度变化 因为有时候键盘比较高 有时候比较矮 但是指南会调整以符合显现的尺寸 当键盘依默认设定而浮动时 指南会掉到屏幕底部 跟窗口等宽 你绑在顶端定位点的东西 都会跟着移动 那可以解释为安全区域嵌入 所以你也不用再担心那个部分 针对基础用户 大概只需要了解这些就好 但是现在我们要谈有趣的部分 为什么我们要选择使用新的类别 而不要直接用一般的布局指南? 我们希望你现在能用键盘做得事 能比过往还多 下一站会把键盘完全整合进你的app 为什么我会说“整合”呢? 我经常在听人提起键盘时 说得好似那是需要避开的项目 或好似会与布局相赤 可是键盘是app的一部分 界面键盘布局指南背后有个主要动机 是要以一种前所未有的方式 让你和开发者有能力用不同方法响应 让用户可以输入文字 并让你真的 完全把键盘 视为布局的一部分 我真的很期待看到你们利用 这些新功能 所以我们的下一站 是什么让键盘布局指南 不只是一个布局指南?
有了界面键盘布局指南 你就能够 以化身之姿完全跟随键盘 如果你这样选择的话 通过使用新功能 跟随浮动键盘 在默认值会被视为错误 但如果你设定成正确 指南就会在键盘浮动或漂浮时 跟随键盘 让你对布局如何响应键盘位置 有很大的控制权限
再也不会自动掉到底部 浮动时 不会再听到隐藏键盘通知 布局指南会跟着键盘走 不过 获得这个信息的重点 在于其代表你可以更意识到 你的布局如何响应不同类型的键盘 所以界面键盘布局指南是一个子集 隶属另一个新的布局指南 界面追踪布局指南 我们称之为追踪布局指南 是因为当它在屏幕上移动时 其会追踪你想要更改的约束 你可以赋予它约束数组 在靠近特定边缘时激活 离开时停用 及或一连串指令 当特别远离边缘时激活 靠近时停用 现在看这个示例 了解怎么作用 以及你实现目标所需的代码 这是测试的app 我有一个文字栏还有一些控制钮 可以位在键盘上 可是当它靠近屏幕顶端时
我希望它们掉到底部 以防跑到屏幕外
当键盘左右移动时 我希望其余界面切换一下 让键盘有更多空间 那么要怎么做呢? 我们要看一些代码 在接下来几张投影片中 编辑视图是有文字栏和控制钮的视图 图像视图则是图像的画面 好的 注意我们在这里 应该使用标识符 你可在示例代码中找到 但是在投影片上这个大小比较刚好 先说说垂直轴 发生什么事 首先 我们定义出一个数组 把编辑视图绑在键盘布局指南顶端
接着 把它们设定为 只在指南远离顶端时激活 那么在其靠近时就会停用
接着 我们定义另一个约束数组 指定键盘靠近视图顶端时 我们想要有的约束 所以 不用键盘布局指南的顶端 我们改选安全区域的底部 这里有个快速画面可以辅助 这是指南和编辑视图 目前远离顶端 因此远离顶端约束的指令被激活了 但是当你把指南移动到靠近顶端 远离的约束指令就会停用 靠近顶端约束就会被激活 将其降至视图底部 我们回到远离顶端 就会发生相反状况 现在看看水平移动 键盘远离 前缘和后缘时 我希望编辑视图位于键盘中央 我希望图像视图也位于画面中央 因此我定义那些约束 并设定为 远离前缘和后缘时激活
现在 来设定看我们靠近边缘时 会发生什么事
我希望当我们位于后缘时 编辑视图可以移开 而往前缘移动 所以首先 先处理这个 我希望图像视图稍微远离键盘一点 这样当我们靠近两侧 就能它从中间移到键盘对侧 当键盘在后缘时 朝前缘移动 反之亦然 接着 我把这些设定为 当我靠近适当边缘时激活 当键盘进入该区域时 它们会激活 键盘离开时就停用 就这样! 把非常先进的键盘整合 进你专属的布局 再来看一次画面 这是我的编辑视图 跟漂浮的键盘在一起 当我们朝顶端移动时 其会掉到底部 当我们左右移动时 刚刚说的改动就发生了 非常酷! 接下来 要来介绍“靠近”和 “远离”对键盘的意义 固定的键盘会被视为 靠近底部 远离其他边缘
浮动和分开的键盘可能远离所有边缘 或靠近顶缘 如果是漂浮键盘 有可能靠近或远离所有边缘 也可能同时间靠近两个邻近边缘 这会导致一些可能很有趣的冲突 你应该要了解 现在 以上状况只适用于 你把跟随浮动键盘设定为真时 我们谈到的其余内容 是假设我们可能造成的状况 好的 最后阶段 完整键盘整合的考量 键盘就是键盘 只是键盘 直到它不再是键盘 当你选择要跟随浮动键盘时 得多考虑一些问题 设计你的布局时 应该注意哪些事呢? 一定要注意 漂浮键盘 有可能远离所有东西 如果其远离所有边缘 你有充分信息可以正确参照吗? 另外 当键盘远离底部边缘 或靠近顶部 会发生什么状况呢? 你也要留心 键盘的顶端定位点 因为它有可能跑到很上面! 所以务必注意 解决方法是设定约束 当键盘远离底部边缘时 把键盘顶端定位点的视图移开 并下移到安全区域布局指南的底部
用户也能随时移动键盘 因此你不能想着它会在特定地方 这个也要放在心上
这里有个罕见的样本 分开的键盘 分开且浮动的键盘远离所有边缘 直到太靠近顶端 如同固定键盘一样 其也一直远离前缘和后缘 现在来介绍一些新东西 有个新方法 可以把文字融入你的app 今年 用相机吧
它依然是键盘 所以也一样可以使用指南
跟一般固定键盘一样 只是它是其中一种 可以调整到近乎全屏幕的键盘 想知道更多今年如何利用相机 输入文字 请不要错过 “用相机当键盘在app输入” 继续刚刚提到的新东西 如果有附加硬件键盘呢? 今年新增的功能 我们有附加快捷栏 不再是全幅 宽度会根据你使用的语言 以及快捷栏有多少按钮而改变
之前的宽度一直都跟屏幕等宽 但现在 如果你跟随浮动键盘 事实上可以使用快捷栏真正的前缘 及后缘 所以边缘有什么重要的? 在正常的位置下它一直都靠近底部 远离其他三边 但是其可以缩小! 如果你把它缩小 它也能 靠近前缘或后缘
对了 这是使用键盘的宽度定位点时 可能想要多留心的几个原因之一 其也可能缩得非常小 或与屏幕等宽 接下来进入这趟旅程最有趣的地方 如果你不是屏幕上唯一的app 你在跟随浮动键盘呢? 首先 记得键盘 可以让你的app有空间 发生这种状况时 我们要以 键盘收起的状况处理 第二 当你的app处于最窄状态 会显现顶端与底部边缘 但是前缘与后缘保持远离 无论键盘是否叠到你的app 另外 指南也会测量键盘哪个部分 叠到app窗口 如果你不是屏幕上唯一的app的话 现在来看一下一些画面 让你知道我在说什么 这些状况只适用于如果你有把 跟随浮动键盘设定为真 如果你还没设 指南会位于屏幕底部 与窗口等宽 当你切换成全屏幕 键盘漂浮且位于中间 你就会远离所有东西 所有的远离约束都被激活 所有的靠近约束都被停用
当另一个app出现在屏幕上 如果你是比较宽的app 你还是够宽可以让键盘 远离所有东西 但是不用移动太多 就能靠近水平边缘 这也类似画肖像画 但是 在半屏幕时 位于同样位置的键盘 现在靠近你的前缘 指南只能缩小到符合 键盘叠到app的那部分
当你是狭窄的应用程序 指南总是会想要 远离水平边缘 跟iPhone或固定键盘一样 不过你依然可以靠近顶端边缘
再次注意 指南会缩小到 只叠到app的部分 当你固定键盘 它又变成全尺寸 其也远离前缘、后缘和顶端边缘 再次注意 布局指南 又再次与叠到app的部分一样大 如果你是滑动的app 也会随之重新调整尺寸 有了前面的示例和我们的示范代码 这应该都能处理得很好 你只要切记你有可能 处于其中一种状况就好 你现在应该准备好把你的app 带入键盘整合的下个阶段 所以 使用键盘布局指南吧 如果你的app可以的话 利用界面追踪布局指南的 先进功能 最重要的 如果你曾经把键盘布局 视为一场战斗 或想避开键盘 现在开始转念 思考怎么把它整合进你的布局 而如果你已经有这样的想法 现在你有更多工具 可以了解你的全面视野 我们的旅程也进入尾声 离开前别忘了 您的随身物品 也别忘了逛逛礼品店 祝您有愉快的WWDC体验 [飘逸的打击乐]
-
-
1:31 - Using notifications with a custom layout guide
... keyboardGuide.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true keyboardGuide.topAnchor.constraint(equalTo: textView.bottomAnchor).isActive = true keyboardHeight = keyboardGuide.heightAnchor.constraint(equalToConstant: view.safeAreaInsets.bottom) NotificationCenter.default.addObserver(self, selector: #selector(respondToKeyboard), name: UIResponder.keyboardWillShowNotification, object: nil) } @objc func respondToKeyboard(notification: Notification) { let info = notification.userInfo if let endRect = info?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect { var offset = view.bounds.size.height - endRect.origin.y if offset == 0.0 { offset = view.safeAreaInsets.bottom } let duration = info?[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval ?? 2.0 UIView.animate(withDuration: duration, animations: { self.keyboardHeight.constant = offset self.view.layoutIfNeeded() }) } }
-
3:09 - Transitioning to keyboardLayoutGuide
view.keyboardLayoutGuide.topAnchor.constraint(equalToSystemSpacingBelow: textView.bottomAnchor, multiplier: 1.0).isActive = true
-
6:46 - Vertical positioning
let awayFromTopConstraints = [ view.keyboardLayoutGuide.topAnchor.constraint(equalTo: editView.bottomAnchor), ] view.keyboardLayoutGuide.setConstraints(awayFromTopConstraints, activeWhenAwayFrom: .top) let nearTopConstraints = [ view.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: editView.bottomAnchor), ] view.keyboardLayoutGuide.setConstraints(nearTopConstraints, activeWhenNearEdge: .top)
-
7:44 - Horizontal positioning
let awayFromSides = [ view.keyboardLayoutGuide.centerXAnchor.constraint(equalTo: editView.centerXAnchor), imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor), ] view.keyboardLayoutGuide.setConstraints(awayFromSides, activeWhenAwayFrom: [.leading, .trailing]) let nearTrailingConstraints = [ view.keyboardLayoutGuide.trailingAnchor.constraint(equalTo: editView.trailingAnchor), imageView.leadingAnchor.constraint( equalToSystemSpacingAfter: view.safeAreaLayoutGuide.leadingAnchor, multiplier: 1.0) ] view.keyboardLayoutGuide.setConstraints(nearTrailingConstraints, activeWhenNearEdge: .trailing) let nearLeadingConstraints = [ editView.leadingAnchor.constraint(equalTo: view.keyboardLayoutGuide.leadingAnchor), view.safeAreaLayoutGuide.trailingAnchor.constraint( equalToSystemSpacingAfter: imageView.trailingAnchor, multiplier: 1.0) ] view.keyboardLayoutGuide.setConstraints(nearLeadingConstraints, activeWhenNearEdge: .leading)
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。