xcode SwiftUI忽略`onLongPressGesture` minimumDuration参数

j91ykkif  于 2023-08-07  发布在  Swift
关注(0)|答案(1)|浏览(99)

处理长时间点击手势时出现问题。我们的想法是在LazyVGrid内部的同一视图上进行短时间和长时间的点击。长时间的点击时间似乎仍然是0.5秒,这在我的情况下太长了。我试图将其减少到0.1,但它似乎被忽略了

ScrollView {
        Text("Greeting")
        LazyVGrid(columns: ) {
            ForEach(
                models
            ) { model in
                View(
                    model: pointModel
                )
                .onTapGesture {
                    model.didSelect()
                }
                .onLongPressGesture(minimumDuration: 0.1, perform: {
                    model.didLongTap()
                })
            }
        }

字符串
我已经尝试了下一个解决方法:
1.更改长/单次点击的顺序,以便首先定义长。它会导致ScrollView停止滚动
1.使用.gesture添加手势,但未进行任何更改
我期望长按操作考虑到最小持续时间

txu3uszq

txu3uszq1#

使用simultaneousGesture

.onTapGesture {
    print("Tap")
}
.simultaneousGesture(
    LongPressGesture(minimumDuration: 0.1).onEnded { _ in
        print("Long Press")
    }
)

字符串
如果您按下的时间少于系统定义的持续时间(系统认为“点击”应该持续的最大持续时间),则会触发点击手势,如果您按下的时间至少为0.1秒,则会触发长按手势。
这意味着有时两个手势都会被触发-当您按下的时间小于系统定义的持续时间,但超过0.1秒时。
如果你不想这样,你也可以用LongPressGesture来实现点击手势,只需要很短的最小持续时间。然后,使用exclusively(before:)处理冲突。

let tap = LongPressGesture(minimumDuration: 0.0001).onEnded({ _ in
    print("Tap")
    })

let longPress = LongPressGesture(minimumDuration: 0.1).onEnded({ _ in
    print("Long Press")
    })

YourView()
     // Give longPress more precedence over tap
    .gesture(longPress.exclusively(before: tap))

相关问题