大多数浏览器和
Developer App 均支持流媒体播放。
-
使用摄像头在您的 app 中进行键盘输入
了解如何支持实况文本并从摄像头智能拉取信息,以填充 app 中的表单和文本字段。我们将展示如何应用内容过滤,以在有人将摄像头用作键盘输入时获取正确信息,并将其运用于相关 UITextField,帮助您的 app 输入数据,例如电话号码、地址和航班信息。同时,我们还将探索如何创建自定义界面,扩展 UIImageView 等其他控制功能,以支持此功能。关于支持 app 中自动填充功能的更多信息,我们建议观看 WWDC20 的“随时随地自动填充”和 WWDC17“获得更好文本输入体验的关键”。
资源
相关视频
WWDC23
WWDC21
WWDC20
-
下载
♪播放重低音音乐♪ ♪ 大家好 我是朗桑托斯 我是专门处理“键盘”的软件工程师 今天要跟各位介绍如何善用 新功能输入文本 不是通过打字或听写 而是通过相机 我们非常努力的工作 使这个功能得以发布 现在终于到了WWDC大会 我准备好要去度假了 等到安全之后 我想要休个假去旅行 不过旅行有件事很困扰我 就是要处理所有非数码的文本 你们懂我意思吧? 发票、活动传单 还有他们在酒店房间 留给你的巨型文件夹 幸好 iOS 15有新功能 可以让你 从周遭环境中捕捉文本 让我示范给你看 来看看吧! 我在构建这个旅行日志app 我会用它来记载我的行程 以及我停留的地点 像是我上一趟去夏威夷的旅行 在顶端这里 我可以添加图像标头 也许是我的“相机胶卷”里 美丽的风景照 接着有几个栏位要填入酒店信息 例如名称、电话号码和地址 其实这些信息我全都有 就在我眼前的文件上
但是我不想全部用打字输入 现在我不用打字了 例如 如果我在“电话号码”栏位 轻点两下 就会在编辑菜单中看到新选项 使用“照片中的文本” 启动之后 相机会立即辨识 文件上这一堆文本 我可以锁定画面 只选择电话号码 然后轻点“插入” 就完成了 我想这功能非常棒 让我想起一句俗语 一画胜千言 可是有了这个功能 我们真的可以从一张照片中 提取千言万语 总之 就像我前面说的 我想让你知道如何善用这个功能 先从介绍筛选内容开始吧 如果你还记得的话 我必须从文本的大方框中 拖选电话号码 但是如果app知道我在找电话号码 我就不必这么做 它应该忽略其他内容 只提取数字 所以首先 我会让你看看 筛选你想要的内容有多简单 使用TextContentType 就能完成筛选 而在文本框和文本视图有 keyboardType性质可选 事实上 你可能已经使用这些性质 来支持“自动填充”这类的功能 如果是的话 那很棒 你会从相机输入获得额外的效益 如果你还没用过那些功能 这里有一些前几年的视频 可以供你参考 好的 回到TextContentType TextContentType 可以是其中一个数值 但是相机不会筛选所有类型 它只会筛选这七种 现在来看一些示例 这是前四个 电话号码 完整街道地址、链接和邮箱 以上在现今的iOS里原本就有 而在新的iOS 15里 我们多加了三种类型 航班号、运货跟踪号码 以及日期、时间和持续时间的组合 你可以想象对旅游app而言 航班号多有用 或运货跟踪号码 对包裹跟踪app来说有多酷 总之 这就是使用 这些内容类型的方法 超级简单 如果你在Interface Builder 请在“属性”检查器中 查找“内容类型”与“键盘类型” 如果你要在代码里做这件事 只要指派你想要的数值即可 在我的旅行日志app中 “电话号码”栏位 是使用电话按键键盘 “地址”栏有 fullStreetAddress的 textContentType 请注意电话号码的部分 我把autocorrectionType 设定为否 因为如果没有自动改正 或预测文本候选的话 iOS会给你一个按钮 可以快速访问相机 好的 现在回到我的app 我们可以试着再次捕捉酒店电话号码 不过这次 用我们改动的代码 现在 当我叫出相机 它会聪明地忽略所有其他文本 只留下电话号码 现在在“地址”栏再试一次
快多了 不用再一直轻点和轻扫 这就是你筛选内容的方法 接下来进入不同的挑战 我们要怎么让这项功能 更为人所知 真正促进其使用呢? 身为app开发者 我们喜欢简化的用户界面 也就是说我们有时候会有额外的功能 隐藏在菜单背后 以及用户不知道的手势 例如 如果我使用我app里的 “笔记”栏 看不出来我可以在这里用相机输入 要轻点第二次才会出现编辑菜单 候选栏有预测文本 而非我之前给你看的按钮 所以如果你想要在屏幕上 出现暗示可用相机输入的按钮 你就会想要添加 你自己专用的启动按钮 要这么做 首先需要创建一个UIAction 使用captureTextFromCamera 工厂方法 这是iOS 15的新功能 这个动作知道如何启动相机 同时在它与按钮和菜单一起使用时 提供图像和标签 现在来为我的app添加一个菜单 上面要有从相机插入文本的项目 所以又回到我的app 编辑笔记栏时 我的键盘上方会出现这个工具栏 轻点有相机图标的第二个项目时 我希望出现一个 有一堆相机相关动作的菜单 如我们的新功能“照片中的文本” 我们来创建这个动作 请注意 除了可选的标识符之外 工厂方法只需要响应者接受文本即可 接着 我帮其他菜单项目创建动作 最后 把我刚才创建的每个动作 合并成菜单并输入数据 包括textFromCamera的动作 切记 我不需要指定标题 也不需要指定使用的图像 动作都会提供 标题甚至会为了我本地化 好的 来试试看吧 我们回到app 这里是“笔记”栏 及有相机菜单的工具栏 先让我输入一些 我眼前活动传单上的文本
完成! 只要短短几行代码就完成 一个用户可发现的启动器 不过 还有一件事要留心 在你添加任何相机启动器之前 你会想要先确认 canPerformAction withSender的结果 那是因为我们的UIAction是通过 调用UIResponder的新方法来运行 这个对象称为 captureTextFromCamera 运行方式类似标准编辑动作 像剪下、复制和贴上 而那些动作并不总是适用 取决于上下文 例如 如果你什么都没选择 就不能剪下文本 这里也一样 captureTextFromCamera动作 需要一些先决条件 那个方法可以确保所有要求都符合 可是现在先查看各个内容 这样一来 你就更能了解 为什么那个方法可能终止处理 首先 有一些硬件要求 不是所有可以运行iOS 15的设备 都支持该功能 设备应为iPhone 但不是随便的iPhone 要具备神经网络引擎 拥有机器学习超级能力的 iPhone才行 除了硬件之外 你的响应者还必须处理文本插入 我们之后会再谈更多 接下来 这可能很明显 但是如果你的响应者 是一个文本视图或文本框 那必须要能编辑 最后 用户的首选语言中 一定要有这七种可支持语言 至少其中一种 现在你已经做好万全准备 可以处理相机输入了 可是在我们结束之前 让我给你看一些我添加在 我的app里有趣的东西 还记得标头相片吗? 相片很美 可是我觉得如果在上面 加一个图片说明感觉满酷的 也许可用我的相机捕捉图片说明 所以我在这里加一个启动钮 就跟我在菜单项目所做的一样
现在 我可以捕捉文本 放在我的图像上 可是我要怎么做呢? 我是说 那是图像视图 而不是文本控制 我们先倒退 回想文本控制的原理 之后再谈图像视图 文本控制是采用 名为UIKeyInput的协议 其定义了一组基本方法 让响应者接受键盘输入 该协议有三种方法 其中一种是insertText法 那个方法正是我们 把文本从相机传送到你的app的方法 所以要让响应者支持相机输入 就需要采用这个协议 我知道我刚才说文本控制 是采用UIKeyInput 可是在现实世界 它们采用的协议 称为UITextInput 也就是UIKeyInput的延伸 如果你采用UITextInput 在使用相机时会得到额外的功能 可以预览插入的文本 这里显示的setMarkedText法 可以做到 不过有预览功能是可选的选择 如果你不想要有那个功能 你只需要采用 UIKeyInput就可以了 剩下最后一个协议要介绍 几分钟前你可能已经发现了 UIKeyInput本身延伸了 UITextInputTraits 那个协议只包含可选的性质 像是keyboardType 和textContentType 你之前就知道是用来筛选 特定内容的相机输入 所以针对相机输入 你会想要采用UIKeyInput 但这可选择 依你想要的功能程度 决定采用UITextInputTraits 或UITextInput 好了 现在 再回到ImageView吧 我要创建一个新的类别 叫做HeadlineImageView 子类为UIImageView 并采用UIKeyInput 这是它在代码里的样子 就是一个UIImageView的子类 有UILabel子视图 我们会用来显示图片说明 记得 要采用UIKeyInput 我们需要三个方法 hasText、deleteBackward 以及insertText 响应者通常会采用UIKeyInput 来召唤键盘 可是因为我只想要相机输入 而不是键盘输入 我们只需要实现insertText 这个方法就行了 hasText可以直接终止处理 而deleteBackward 不需要做任何动作 至于insertText 它的实现相当简单 只要从相机获得文本 并交给我们的标签就好 就这样而已! 现在我们有图像视图 也知道怎么显示 用相机捕捉的图片说明 谢谢各位与我共度这趟旅程! 我希望你们离开时可以清楚记得 好好利用文本内容类型 它们可通过不只一种方式协助你 包括筛选相机捕捉的文本 当你真的想要推广相机输入时 创建你自己的启动器 我们提供外观一致的标签和图像 用户可跨越不同app 与相机输入联系在一起 可是一定要先确认 该功能是否可用 最后 记得你可以在 不是文本控制的自定义响应者 使用相机输入 只需要采用 UIKeyInput协议就行了 祝各位旅途平安 好好享受 2021年WWDC接下来的旅程吧! ♪
-
-
3:33 - Filtering text field input
phone.keyboardType = .phonePad phone.autocorrectionType = .no address.textContentType = .fullStreetAddress
-
5:07 - Custom action to capture text from camera
let textFromCamera = UIAction.captureTextFromCamera(responder: self.notes, identifier: nil)
-
5:41 - Adding custom UIAction for capture text to a menu
let textFromCamera = UIAction.captureTextFromCamera(responder: self.notes, identifier: nil) let choosePhotoOrVideo = UIAction(…) let takePhotoOrVideo = UIAction(…) let scanDocuments = UIAction(…) let cameraMenu = UIMenu(children: [choosePhotoOrVideo, takePhotoOrVideo, scanDocuments, textFromCamera]) let menuToolbarItem = UIBarButtonItem(title: nil, image: UIImage(systemName: "camera.badge.ellipsis"), primaryAction: nil, menu: cameraMenu)
-
9:59 - Implementing UIKeyInput on a custom image view
class HeadlineImageView: UIImageView, UIKeyInput { var headlineLabel: UILabel = UILabel() var hasText: Bool = false override init(image: UIImage?) { super.init(image: image) initializeLabel() } func insertText(_ text: String) { headlineLabel.text = text } func deleteBackward() { } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。