3D Touch — 苹果的硬件技术,能够识别iPhone屏幕上的按压力度,及其软件替代品Haptic Touch,基于触摸时长工作。3D Touch使用安装在屏幕矩阵下方的校准压力传感器(Force Touch),可以区分轻按(peek)和重按(pop)。从iOS 13开始,苹果用Haptic Touch取代了3D Touch——一种通过长按(Long Press)模拟强力按压并带有触觉反馈的技术UIContextMenuInteraction。
要点
3D Touch — 于iPhone 6S(2015年)首次亮相的硬件输入技术。屏幕表面下方设有电容传感器,用于测量玻璃与背光之间的距离。用手指按压时,玻璃会发生微米级的弯曲,传感器记录形变大小并将其转换为力度值(克)。iOS区分三个级别:轻触(touch)、中等按压(peek,约200克)和重按(pop,约400克)。
Haptic Touch — 3D Touch的软件替代品,于iOS 13(2019年)推出。Haptic Touch不是测量压力,而是使用长按(手指按住约500毫秒)来激活相同的操作。触觉反馈(haptic feedback)模拟“点击”的感觉,尽管没有发生任何物理按压。苹果转向Haptic Touch是因为3D Touch屏幕的生产复杂且成本高昂,特别是在过渡到带有Face ID的OLED面板时。
历史背景:3D Touch出现在iPhone 6S中,一直保留到iPhone XS(2018年)。iPhone XR(2018年)是第一款使用Haptic Touch而非3D Touch的设备。从iPhone 11(2019年)和iOS 13开始,所有新款iPhone都使用Haptic Touch。iPad从未获得3D Touch——仅从iPadOS 13开始支持Haptic Touch。Apple Watch在屏幕中使用Force Touch技术(与iPhone 3D Touch不同),该技术从watchOS 7和Series 6开始被移除。
Force Touch — 苹果在iPhone 6S–XS(3D Touch)、MacBook触控板(2015年后)和Apple Watch(Series 1–5)中使用的按压力度测量技术。其基础是分布在屏幕周边的电容传感器。按压时,玻璃会发生微米级变形,传感器记录距离变化并根据校准曲线计算力度。系统会考虑环境温度(每24小时校准一次)和手指位置(屏幕中心更敏感)。
校准 — 3D Touch的关键方面。每部iPhone在工厂单独校准。iOS还会执行动态校准:启动后第一次按压时,系统会请求用户的最大力度并调整灵敏度。传感器的精度为±10克,范围从0到500+克。开发者可以通过UITouch.force(从0.0标准化到最大值)或UITouch.maximumPossibleForce获取力度值。
// 检查3D Touch的可用性并读取按压力度
class ForceTouchViewController: UIViewController {
override func touchesMoved(_ touches: Set<UITouch>,
with event: UIEvent?) {
guard let touch = touches.first else { return }
// 检查设备上的Force Touch支持
guard self.traitCollection.forceTouchCapability
== UIForceTouchCapability.available else {
// 设备不支持3D Touch
return
}
// 读取按压力度(0.0 — 最大)
let force = touch.force // 0.0 ... maximumPossibleForce
let maxForce = touch.maximumPossibleForce
// 标准化到0.0–1.0范围以进行可视化
let normalizedForce = force / maxForce
// 对按压力度的视觉反应(元素缩放)
forceView.transform = CGAffineTransform(scaleX: 1.0 + normalizedForce * 0.3,
y: 1.0 + normalizedForce * 0.3)
}
}限制:3D Touch仅在触摸活跃时工作(UITouch.phase == .began或.moved)。松开后,力度值归零。最大力度值因设备而异:iPhone 6S为6.6666,iPhone 7/X最高可达20.0(由于校准不同)。不要将force用于关键操作——用户可能不知道要用多大的力按压。始终通过Haptic Touch(长按Long Press)提供替代方案。
Peek and Pop — 苹果在iPhone 6S中随3D Touch推出的原始UX模式。Peek——轻按(force约0.5–1.0),以预览卡片的形式显示内容预览(邮件、链接、照片)。Pop——更深地按压(force约2.0+),在全屏打开内容。Peek支持底部操作(分享、复制、回复),可通过在预览卡片上向上滑动访问。
Peek and Pop在UIKit中的实现包括三个组件:UIViewControllerPreviewingDelegate(包含previewingContext(_:viewControllerForLocation:)和previewingContext(_:commit:)方法的协议)、UIPreviewAction(底部操作)以及通过registerForPreviewing(with:sourceView:)注册。开发者指定在Peek时显示哪个ViewController以及在Pop时如何打开它。系统会自动添加视差动画和背景模糊。
| 手势 | 力度(标准化) | 操作 | 视觉效果 |
|---|---|---|---|
| 触摸(Touch) | 0.0–0.3 | 正常交互 | 元素高亮 |
| 轻按(Peek) | 0.5–1.0 | 内容预览 | 带背景模糊的卡片 |
| 重按(Pop) | 2.0+ | 全屏打开 | 卡片展开动画 |
| 向上滑动 | — | 操作(分享、复制) | UIPreviewAction组 |
过渡到UIContextMenuInteraction(iOS 13):苹果通过UIContextMenuInteraction用上下文菜单取代了Peek and Pop。新API更简单:不需要UIViewControllerPreviewingDelegate,支持分层菜单(子菜单)、SF Symbols图标,并且在3D Touch和Haptic Touch上工作方式相同。迁移:registerForPreviewing从iOS 13起已弃用。将其替换为UIContextMenuConfiguration,它会自动适应设备的能力。
UIContextMenuInteraction — 从iOS 13开始可用的现代iOS上下文菜单API。通过addInteraction(_:)添加到任何UIView。UIContextMenuInteractionDelegate委托提供菜单配置:带有标识符的UIContextMenuConfiguration、previewProvider(可选,用于预览)和actionProvider(UIAction或UIMenu数组)。上下文菜单通过3D Touch(如果可用)或Haptic Touch(其他设备上长按Long Press)激活。
// 带有分层菜单的UIContextMenuInteraction
class ContextMenuViewController: UIViewController,
UIContextMenuInteractionDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let interaction = UIContextMenuInteraction(delegate: self)
contextMenuView.addInteraction(interaction)
}
func contextMenuInteraction(_ interaction: UIContextMenuInteraction,
configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
return UIContextMenuConfiguration(identifier: nil,
previewProvider: { PreviewViewController() }) { _ in
let share = UIAction(title: "分享",
image: UIImage(systemName: "square.and.arrow.up"),
handler: { _ in self.shareContent() })
let edit = UIAction(title: "编辑",
image: UIImage(systemName: "pencil"),
handler: { _ in self.editContent() })
let delete = UIAction(title: "删除",
image: UIImage(systemName: "trash"),
attributes: .destructive,
handler: { _ in self.deleteContent() })
return UIMenu(title: "操作", children: [share, edit, delete])
}
}
}UIContextMenuConfiguration支持previewProvider——作为预览显示的控制器。如果previewProvider为nil,则上下文菜单不带预览显示。使用UIContextMenuContentPreviewProvider自定义预览的大小和外观。上下文菜单会自动获得触觉反馈(Haptic Touch Engine)和出现动画(缩放+淡入)。
Haptic Touch和3D Touch——通往同一结果的不同技术。3D Touch是硬件(屏幕中的压力传感器),Haptic Touch是软件(长按Long Press + Taptic Engine进行触觉模拟)。3D Touch需要生产成本(额外的传感器层),增加屏幕厚度和维修复杂度。Haptic Touch更便宜,生产更简单,并且可在所有现代设备上使用(iPhone SE 2020、iPhone 11–16、iPad、iPod touch)。
| 参数 | 3D Touch | Haptic Touch |
|---|---|---|
| 原理 | 压力测量(克) | 时间测量(毫秒) |
| 可用性 | iPhone 6S–XS(有限) | iPhone XR+、iPad、iPod touch |
| 速度 | 即时(约100毫秒) | 有延迟(约500毫秒) |
| 按压级别 | 2级(peek + pop) | 1级(上下文菜单) |
| 触觉反馈 | Taptic Engine(模拟点击) | Taptic Engine(模拟点击) |
| App Store | 图标上的快速操作 | 图标上的快速操作 |
| 校准 | 自动适应用户力度 | 不需要 |
| 可维修性 | 复杂(传感器在屏幕中) | 标准 |
对UX的影响:3D Touch速度更快——用户在强力按压时立即获得上下文菜单。Haptic Touch需要500毫秒的暂停,感觉更慢。不过苹果通过触觉反馈和视觉动画弥补了这一点。从3D Touch过渡到Haptic Touch的用户通常会注意到速度差异。对于开发者来说,迁移是透明的:UIContextMenuInteraction在两种技术上的工作方式相同。
快速操作(Quick Actions)——主屏幕上应用程序图标上的上下文菜单。在图标上强力按压(3D Touch)或长按(Haptic Touch)可显示最多4个快速操作:“新消息”(Messages)、“拍照”(Camera)、“搜索”(Safari)。通过Info.plist键UIApplicationShortcutItems或通过UIApplicationShortcutItem委托实现。Quick Actions在所有运行iOS 13+(Haptic Touch)或支持3D Touch的设备上可用。
键盘触控板——在iOS键盘上强力按压可将其切换到触控板模式:按键变为非活动状态,手指移动可移动光标。3D Touch通过在键盘的任何位置强力按压来激活触控板。Haptic Touch通过长按空格键(spacebar)激活触控板。触控板模式已成为3D Touch最流行的应用之一——用户看重在编辑文本时精确定位光标的能力。
链接和照片预览——在Safari中强力按压链接可显示页面预览(peek)而不导航。类似地:在Messages中按压照片可打开放大版本。在peek模式下向上滑动可显示操作:“打开”、“添加到阅读列表”、“拷贝”。所有这些场景在现代iOS版本中都通过UIContextMenuInteraction实现。
绘画和创意应用——在Procreate、Photoshop和其他绘画应用中,3D Touch的按压力度控制画笔的粗细、不透明度或颜色饱和度。应用读取UITouch.force(0.0–1.0)并将其转换为工具参数。然而,在iPad上使用Apple Pencil绘画可提供更精确的压力控制(支持倾斜和方位角),因此3D Touch在iPhone上的创意应用中需求较低。
常见问题
3D Touch——通过屏幕中的电容传感器测量按压力度的硬件技术(iPhone 6S–XS)。Haptic Touch——使用长按(Long Press)和Taptic Engine触觉反馈的软件模拟。3D Touch更快(100毫秒对比500毫秒)并支持两个力度级别(peek + pop)。Haptic Touch在所有运行iOS 13+的设备上可用,包括iPhone XR、所有iPhone 11–16型号、iPad和iPod touch。
在代码中使用traitCollection.forceTouchCapability。值为.available表示支持3D Touch,.unavailable表示不支持,.unknown表示尚未确定(等待traitCollectionDidChange)。在支持Haptic Touch的设备上,forceTouchCapability返回.unavailable,因为Haptic Touch不使用硬件力度传感器。对于用户检查:设置→通用→辅助功能→3D Touch(仅限旧款iPhone)。
苹果用Haptic Touch取代了3D Touch原因如下:带压力传感器的屏幕生产成本高、维修复杂(传感器集成在屏幕中)、用户认知有限(许多人不知道此功能)以及过渡到带有Face ID的OLED屏幕(更难为3D Touch校准)。Haptic Touch更便宜、更简单并且可在更多设备上使用。
3D Touch支持以下型号:iPhone 6S、6S Plus、7、7 Plus、8、8 Plus、X、XS、XS Max。iPhone XR没有3D Touch(第一款使用Haptic Touch的机型)。所有iPhone 11、12、13、14、15、16和SE(第2代和第3代)型号均使用Haptic Touch。iPad从未拥有3D Touch。在支持3D Touch的设备上还可进行灵敏度设置(设置→通用→辅助功能→3D Touch)。
是的,iOS会自动模拟3D Touch,在没有硬件支持的设备上通过Haptic Touch实现。UIContextMenuInteraction API在所有设备上的工作方式相同——系统自行选择触发器(3D Touch或长按Long Press)。对于您的代码来说这是透明的:上下文菜单在所有运行iOS 13+的设备上出现。您无需为3D Touch和Haptic Touch编写单独的逻辑——使用UIContextMenuConfiguration即可。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。