使用SwiftUI(最新的XCode和IOS 13.3上的测试),我试图对列表中的项目实施长按手势,以允许用户与各个项目进行交互。问题是,当我在列表中的任何位置(项目本身,列表本身)上设置“ onLongPressGesture”时,列表将无法再滚动。我可以轻松地轻按一下即可工作,但长按则可以滚动。
我整理了一个显示此问题的小例子:
struct ContentView: View
{
let data = [
"Test 1","Test 2","Test 3","Test 4","Test 5",
"Test 6","Test 7","Test 8","Test 9","Test 10",
"Test 11","Test 12","Test 13","Test 14","Test 15",
"Test 16","Test 17","Test 18","Test 19","Test 20"
]
var body: some View
{
List
{
ForEach(data,id:\.self)
{
item in
Text(item).onLongPressGesture{}
}
}
}
}
如果我尝试按任何文本来拖动列表,列表将不会移动。如果我删除了longpress处理程序,则无论我在哪里按下,它都会移动。
答案 0 :(得分:0)
我认为您应该深入研究组合手势。 Here可以看到如何构成两个以上的手势,但是在您的情况下,我认为您需要exclusive的行为(在in this article中进行了描述)。因此,您可以将DragGesture
和LongPressGesture
组合在一起,但是要使用ScrollView
(我没有找到滚动List
的任何解决方案)。以下是example 1和example 2的控制方法ScrollView.content.offset
(用于滚动DragGesture
)。
答案 1 :(得分:0)
我也在Apple Developer Forum上问了这个问题,并找到了解决该问题的方法。如果视图在onLongPressGesture之前定义了onTapGesture处理程序,则该列表将可滚动,同时支持长按单个项目。
onTapGesture处理程序可以为空,只要先声明它即可。
struct ContentView: View
{
let data = [
"Test 1","Test 2","Test 3","Test 4","Test 5",
"Test 6","Test 7","Test 8","Test 9","Test 10",
"Test 11","Test 12","Test 13","Test 14","Test 15",
"Test 16","Test 17","Test 18","Test 19","Test 20"
]
var body: some View
{
List
{
ForEach(data,id:\.self)
{
item in
Text(item).onTapGesture{}.onLongPressGesture{}
}
}
}
}