长按和列表滚动

时间:2019-12-21 22:27:26

标签: 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{}
      }
    }
  }
}

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

2 个答案:

答案 0 :(得分:0)

我认为您应该深入研究组合手势。 Here可以看到如何构成两个以上的手势,但是在您的情况下,我认为您需要exclusive的行为(在in this article中进行了描述)。因此,您可以将DragGestureLongPressGesture组合在一起,但是要使用ScrollView(我没有找到滚动List的任何解决方案)。以下是example 1example 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{}
      }
    }
  }
}