长按和列表滚动

jen*_*odi 9 ios swiftui swiftui-list

使用 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{}
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试在任何文本上拖动列表,列表将不会移动。如果我移除 longpress 处理程序,无论我按下哪里,它都会移动。

jen*_*odi 22

我也在苹果开发者论坛上问过这个问题,并得到了问题的解决方案。如果视图在 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{}
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这似乎在长按手势开始之前增加了相当多的延迟。否则,它会起作用。 (4认同)

Vis*_*kse 6

参考 @Jensrodi 的解决方案,因为它工作完美,尽管通过.onTapGesture.onLongPressGesture.

为了缓解这种情况,您可以使用onLongPressGesture(minimumDuration:)减少/增加到您觉得舒服的持续时间。

请参阅下面的示例

List {
    ForEach(0..<100) { x in
        Text("List number -\(x)")
            .onTapGesture{}.onLongPressGesture(minimumDuration: 0.2) { // Setting the minimumDuration to ~0.2 reduces the delay
                print("long press \(x)")
            }
    }
}
Run Code Online (Sandbox Code Playgroud)


Але*_*кий 0

我认为你应该深入研究如何结合手势进行创作。在这里您可以看到如何组合两个或更多手势,但在您的情况下,我认为您需要独占行为(在本文中进行了描述)。所以你可以结合DragGestureand LongPressGesturebut for ScrollView(我没有找到任何滚动的解决方案List)。以下是如何控制的示例 1示例 2ScrollView.content.offset(用于滚动DragGesture)。