Длительное нажатие и прокрутка списка

Используя 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{}
      }
    }
  }
}

Если я попытаюсь перетащить список, нажав на любой текст, список не переместится. Если я сниму обработчик длительного нажатия, он будет двигаться независимо от того, где я нажимаю.


person jensrodi    schedule 21.12.2019    source источник


Ответы (2)


Я спросил об этом на форуме разработчиков Apple и получил решение проблемы. Если представление определяет обработчик onTapGesture перед onLongPressGesture, список будет прокручиваемым, поддерживая при этом длительное нажатие на отдельные элементы.

Обработчик 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{}
      }
    }
  }
}
person jensrodi    schedule 27.12.2019
comment
К сожалению, это, кажется, добавляет немного задержки перед запуском жеста долгого нажатия. В остальном все работает. - person Joey C.; 20.11.2020

Я думаю, вам следует покопаться в сочинении с помощью комбинирования жестов. Здесь вы можете увидеть, как составить два и более жеста, но в вашем случай, я думаю, вам нужно эксклюзивное поведение (которое описано в этой статье). Таким образом, вы можете комбинировать DragGesture и LongPressGesture, но для ScrollView (я не нашел решения для прокрутки List). Вот пример 1 и пример 2 о том, как управлять ScrollView.content.offset (для прокрутки на DragGesture).

person Александр Грабо&    schedule 22.12.2019
comment
Спасибо за предложения, это интересно для чтения, и я обязательно посмотрю больше, поскольку мне может понадобиться эта функция в других областях позже. Однако я не очень хочу реализовывать для этого несколько жестов. Я бы хотел, чтобы представление списка само обрабатывало прокрутку, давая правильное ощущение нативности. Я могу добавить onTapGesture без блокировки прокрутки. Но только не, если я попробую сделать длинное нажатие, что для меня не имеет смысла. Основное различие между этими двумя жестами - это время, в течение которого палец нажимается без движения. - person jensrodi; 23.12.2019