手势修饰符
在 SwiftUI 中,onLongPressGesture 是一种手势修饰符,允许你监听和响应用户对视图的长按操作。
语法
View().onLongPressGesture(
minimumDuration: TimeInterval = 0.5,
maximumDistance: CGFloat = 10,
pressing: ((Bool) -> Void)? = nil,
perform: @escaping () -> Void
)
参数
1、minimumDuration
长按的最短持续时间(以秒为单位)。默认值是 0.5 秒。
可以通过设置不同的持续时间来调整长按手势的灵敏度。
2、maximumDistance
长按手势允许手指移动的最大距离(以点为单位)。默认值是 10。
如果用户在按下时移动超过此距离,长按手势将失败。
3、pressing
可选的闭包,在手势开始和结束时被调用。
它的参数是 Bool 类型,true 表示用户正在长按,false 表示用户松开了。
4、perform
必须的闭包,定义当长按手势完成后要执行的操作。
基本用法
1、最简单的例子
Text("Press me")
.padding()
.background(Color.blue)
.onLongPressGesture {
print("Long press detected!")
}
效果:
用户长按文本视图 0.5 秒以上,控制台会打印出 “Long press detected!”。
2、自定义长按时间
Text("Press and Hold")
.padding()
.background(Color.green)
.onLongPressGesture(minimumDuration: 1.0) {
print("Long press after 1 second!")
}
效果:
用户需要长按 1 秒才能触发闭包。
3、监听手势状态
Text("Hold Me")
.padding()
.background(Color.orange)
.onLongPressGesture(pressing: { isPressing in
if isPressing {
print("Pressing started!")
} else {
print("Pressing ended!")
}
}) {
print("Long press completed!")
}
效果:
当用户开始按下时,会打印 “Pressing started!”。
当用户松开时,会打印 “Pressing ended!”。
如果用户按住超过默认的 0.5 秒,还会打印 “Long press completed!”。
4、限制手指移动范围
Text("Stay Still")
.padding()
.background(Color.purple)
.onLongPressGesture(maximumDistance: 20) {
print("Long press detected within 20 points!")
}
效果:
用户需要保持手指在 20 点范围内,否则长按手势不会被触发。
具体来讲,maximumDistance 是指手势在视图上触发时,用户手指的移动距离范围(以点为单位)。如果用户的手指在长按期间移动超过这个范围,手势会被认为失败,不会触发 onLongPressGesture 的 perform 闭包。
5、与其他手势结合
onLongPressGesture 可以与其他手势(如 onTapGesture)一起使用,但需要注意手势的优先级:
Text("Tap or Hold")
.padding()
.background(Color.gray)
.onTapGesture {
print("Tapped!")
}
.onLongPressGesture {
print("Long pressed!")
}
效果:
短按会触发 “Tapped!”。
长按超过 0.5 秒会触发 “Long pressed!”。
注意事项
1、手势冲突
如果一个视图有多个手势,SwiftUI 会根据优先级处理它们。通常,onTapGesture 优先于 onLongPressGesture,除非明确处理。
2、手势的传递性
如果子视图有 onLongPressGesture,父视图也有,那么默认情况下,子视图的手势会优先触发。
3、组合手势
可以将 onLongPressGesture 与其他手势结合形成复杂交互。通过 simultaneously 或 exclusively 自定义行为。
示例:长按展示详情
struct ContentView: View {
@State private var message = "Press and hold"
var body: some View {
Text(message)
.padding()
.background(Color.blue)
.cornerRadius(8)
.onLongPressGesture {
message = "You long pressed!"
}
}
}
运行后,用户长按文本视图,消息会动态更新为 “You long pressed!”。
总结
onLongPressGesture 是 SwiftUI 中处理长按手势的便捷方法。
可以通过自定义 minimumDuration 和 maximumDistance 调整触发条件。
与 pressing 参数结合,可以监听按下和松开的状态变化。