用途:在 SwiftUI 中实现、审查或改进步手势交互,覆盖点击、长按、拖拽、缩放、旋转等常见手势,并结合正确的组合方式、状态管理和冲突解决,采用 Swift 6.3 模式与 iOS 26+ 环境。
主要能力:资料系统梳理了 gesture 概览与各手势类型。离散手势(如 TapGesture、LongPressGesture、SpatialTapGesture)只会触发一次,用 .onEnded 处理;连续手势(DragGesture、MagnifyGesture、RotateGesture)会持续产生更新,可用 .onChanged、.onEnded 和 .updating。TapGesture 支持通过 count 参数实现双击、三击,也可用 .onTapGesture 简写。LongPressGesture 在按住达到 minimumDuration 后成功,手指移动超过 maximumDistance 则失败,可用 @GestureState + .updating() 提供按压视觉反馈。DragGesture 提供 startLocation、location、translation、velocity、predictedEndTranslation,可配置 minimumDistance 和坐标空间。MagnifyGesture 自 iOS 17 起取代已弃用的 MagnificationGesture,追踪捏合缩放;RotateGesture 是 RotationGesture 的较新替代,追踪双指旋转角度,二者都支持持久化缩放或旋转值,并在 onEnded 中对范围做钳制。
手势组合:.simultaneously(with:) 允许两个手势同时被识别,值为 SimultaneousGesture.Value,含 .first 与 .second;.sequenced(before:) 要求第一个手势先成功;.exclusively(before:) 只让其中一个成功且前者优先。@GestureState 是属性包装器,手势结束后自动重置为初始值,适合临时反馈;需要持久保存的值应使用 @State,典型做法是把 @State 持久值与 @GestureState 拖动偏移叠加。
视图层级与优先级:.gesture() 为默认优先级,子视图手势优先于父视图;.highPriorityGesture() 让父手势优先于子手势;.simultaneousGesture() 使父子手势都触发,可用于解决父级点击吞掉子级按钮点击的问题。.gesture(_:including:) 可用 GestureMask(.gesture、.subviews、.all)控制哪些手势参与。
自定义与常见错误:可让类型遵循 Gesture 协议,实现 var body: some Gesture 来封装可复用手势,例如滑动方向识别,并可用 View 扩展提供更顺手的 API。常见问题包括父子手势冲突、对临时状态误用 @State、连续手势缺少 .updating() 反馈、在 iOS 17+ 继续使用已弃用手势类型、在 onChanged 中执行昂贵计算(每帧约 60–120 Hz)等。资料还提供审查清单,涉及手势类型、状态选择、反馈、冲突、组合器、数值钳制、自定义遵循体与动画等。
限制:资料未提供具体安装命令、收费与价格信息、平台支持范围或效果保证;部分示例细节需以官方文档为准。