Swift长按手势onLongPressGesture
Swift长按手势onLongPressGesture

Swift长按手势onLongPressGesture

手势修饰符

在 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 参数结合,可以监听按下和松开的状态变化。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注