Swift中.gesture的用法
在 Swift 中,.gesture
是 SwiftUI 框架中用于给视图添加交互手势的核心修饰符。它允许你将各种手势(如点击、长按、拖动、缩放等)绑定到视图上,当用户与视图进行对应交互时,会触发预设的动作。
基本用法
.gesture
修饰符的语法如下:
View.gesture(手势实例.onChanged { 手势变化时的回调 }.onEnded { 手势结束时的回调 }
)
通过这个修饰符,你可以为任意 SwiftUI 视图(如 Text
、Image
、Rectangle
等)添加手势,实现交互逻辑。
常用手势类型
SwiftUI 内置了多种常用手势,以下是最常见的几种:
1. 点击手势(TapGesture
)
用于检测用户的点击操作,支持设置点击次数(如单击、双击)。
Text("点击我").padding().background(Color.blue).foregroundColor(.white).cornerRadius(8).gesture(TapGesture(count: 1) // 单击(默认值,可省略).onEnded {print("被点击了!")})
如果需要双击,只需将 count
设为 2:
TapGesture(count: 2).onEnded { print("双击了!") }
2. 长按手势(LongPressGesture
)
用于检测用户的长按操作,支持设置最小长按时间和是否需要保持按压。
Text("长按我").padding().background(Color.red).foregroundColor(.white).cornerRadius(8).gesture(LongPressGesture(minimumDuration: 1.0) // 至少长按 1 秒.onEnded { _ inprint("长按结束!")})
也可以通过 onChanged
监听长按过程(如“正在长按”的状态):
LongPressGesture().onChanged { isPressing inif isPressing {print("正在长按...")}}.onEnded { _ inprint("长按完成!")}
3. 拖动手势(DragGesture
)
用于检测用户拖动视图的操作,可获取拖动的位移、位置等信息,常用于实现视图的拖拽移动。
struct DragView: View {@State private var offset = CGSize.zero // 记录偏移量var body: some View {Circle().frame(width: 100, height: 100).foregroundColor(.green).offset(offset) // 应用偏移.gesture(DragGesture().onChanged { value in// 实时更新偏移量(value.translation 是当前拖动的相对位移)offset = value.translation}.onEnded { _ in// 结束时复位(可选)offset = .zero})}
}
DragGesture
的 value
包含丰富信息:
translation
:当前拖动的相对位移(相对于起点);location
:当前手指在父坐标系中的位置;startLocation
:拖动开始时的位置。
4. 缩放手势(MagnificationGesture
)
用于检测双指缩放操作,可获取缩放比例,常用于实现视图的放大/缩小。
struct ZoomView: View {@State private var scale: CGFloat = 1.0 // 缩放比例(默认 1.0)var body: some View {Image(systemName: "star").font(.system(size: 100)).scaleEffect(scale) // 应用缩放.gesture(MagnificationGesture().onChanged { value in// value 是当前缩放比例(相对于初始状态,1.0 为原始大小)scale = value})}
}
5. 旋转手势(RotationGesture
)
用于检测双指旋转操作,可获取旋转角度,常用于实现视图的旋转。
struct RotateView: View {@State private var angle: Angle = .zero // 旋转角度(默认 0)var body: some View {Rectangle().frame(width: 200, height: 100).foregroundColor(.purple).rotationEffect(angle) // 应用旋转.gesture(RotationGesture().onChanged { value in// value 是当前旋转角度(单位:弧度)angle = value})}
}
手势组合
SwiftUI 支持将多个手势组合,实现更复杂的交互(如同时支持缩放和旋转)。常用的组合方式有:
SimultaneousGesture
:同时识别多个手势;ExclusiveGesture
:互斥手势(只识别优先级高的);SequenceGesture
:顺序手势(先识别第一个,再识别第二个)。
示例:同时支持缩放和旋转
struct ZoomAndRotateView: View {@State private var scale: CGFloat = 1.0@State private var angle: Angle = .zerovar body: some View {Image(systemName: "heart.fill").font(.system(size: 100)).foregroundColor(.red).scaleEffect(scale).rotationEffect(angle).gesture(// 同时识别缩放和旋转手势SimultaneousGesture(MagnificationGesture().onChanged { scale = $0 },RotationGesture().onChanged { angle = $0 }))}
}
手势优先级
默认情况下,子视图的手势会优先于父视图的手势。如果需要强制父视图的手势优先,可以使用 .highPriorityGesture
修饰符:
VStack {Text("子视图").gesture(TapGesture().onEnded { print("子视图被点击") })
}
.highPriorityGesture( // 父视图手势优先级更高TapGesture().onEnded { print("父视图被点击") }
)
此时点击子视图,会优先触发父视图的手势。
总结
.gesture
是 SwiftUI 中处理用户交互的核心工具,通过它可以轻松为视图添加点击、长按、拖动、缩放、旋转等手势,并支持组合手势和优先级控制,大幅简化了交互逻辑的实现。