Получение настраиваемого UIView для ответа на жест прокрутки трекпада двумя пальцами (или колесо прокрутки мыши)

У меня есть приложение для iPad (на C #) с пользовательским интерфейсом UIView, который позволяет ввод с помощью касания и касаний стилусом Apple Pencil. Я пытаюсь интегрировать косвенную поддержку трекпада / мыши (курсор или «указатель», как его называет Apple).

Я получил работу при наведении курсора, используя HoverGestureRecognizer. Я получил щелчок правой кнопкой мыши и щелчок с нажатой клавишей Control, используя обычные события касания Began / Moved / Ended / Cancelled и проверяя наличие .type == .indirectPointer, а затем проверяя, установлен ли модификатор клавиши управления в event.ModifierFlags или если event.ButtonMask == вторичный.

Я потратил много времени на поиск документации на веб-сайте Apple Developer, начиная с этого и заканчивая разветвлением:

Почему-то я не могу найти API, который система вызывает в моем коде, когда происходит прокрутка трекпада двумя пальцами (или прокрутка колесика мыши). (В другом представлении, которое является представлением прокрутки, я могу получить событие прокрутки представления прокрутки, когда я выполняю прокрутку двумя пальцами, поскольку это встроено в iPadOS 13.4+ для представлений прокрутки, но мое настраиваемое представление не является представлением прокрутки, оно внутри есть только несколько прокручиваемых областей.)

Что я пробовал:

  • UISwipeGestureRecognizer. Ничего не требовалось для жеста прокрутки трекпада двумя пальцами.
  • UIPanGestureRecognizer. Ничего такого.
  • Создание подкласса UIScrollView и добавление UIScrollViewDelegate, просто чтобы посмотреть, будет ли это работать ... Ничего.
  • Создание подкласса GestureRecognizer и добавление этого, а затем переопределение ShouldReceive (UIEvent evt), но это так и не было вызвано.

Во что iPadOS 13.4+ преобразует жест прокрутки двумя пальцами на трекпаде? Могу ли я получить это как своего рода событие? Документация, , ссылка на которую приведена выше довольно разочаровывающе прост, но в нем упоминается UIEvent.EventType.scroll, но не упоминается, как, когда и где система вызовет любой из моих методов с событием этого типа. Довольно бесит. Они просто должны разъяснить это более четко.

Приветствуются ответы на Swift или C #.


person Jared Updike    schedule 17.05.2020    source источник


Ответы (1)


Хорошо, как ни странно, я думал, что попробовал PanGestureRecognizer, но, должно быть, я неправильно его настроил. В примере проекта кода Apple, Интеграция взаимодействий указателя в ваше приложение для iPad, был ответ. (Код C #):

        panRecognizer = new UIPanGestureRecognizer(() => {
            Console.WriteLine("panned -- " + panRecognizer.VelocityInView(this));
        });
        panRecognizer.AllowedScrollTypesMask = UIScrollTypeMask.Continuous;
        AddGestureRecognizer(panRecognizer);

Рад, что понял это!

person Jared Updike    schedule 17.05.2020
comment
Привет, спасибо за это! Я столкнулся с той же проблемой. Я вижу, что прокрутка одним пальцем в трекпаде по-прежнему не распознается с установкой UIScrollTypeMask. Есть ли что-то еще, что вам нужно было сделать (или вас, возможно, интересует только прокрутка двумя пальцами)? - person SuPotter; 27.05.2020
comment
Прокрутка одним пальцем на трекпаде просто перемещает указатель трекпада (курсор), и я не думаю, что вы можете это изменить. Вы можете использовать жесты наведения, чтобы узнать местоположение в вашем обзоре. Так что да, я не думаю, что прокрутка трекпада одним пальцем будет поддерживаться, если вы не добавите модификатор клавиатуры или что-то в этом роде. Может, даже тогда. - person Jared Updike; 28.05.2020
comment
У меня это сработало отлично, спасибо! Хотелось бы, чтобы по этому поводу была документация - person jangelsb; 15.10.2020