Переключите управление UITouch с TouchBegan на UIScrollViewDelegate

Я разрабатываю приложение для рисования для iOS, основная особенность которого заключается в том, что пользователь может загрузить изображение в качестве фона, а затем он может начать рисовать пальцем поверх него, масштабировать и панорамировать изображение с рисунками поверх самого изображения.

Схема приложения следующая.

MainUiView-> UIScrollView-> UIImageView

Рисование и отслеживание пальцев осуществляется на touchesBegan, touchesMoved, touchesEnded, заменяющем UIResponder.

Масштабирование и панорамирование UIImageView управляется реализацией UIScrollViewDelegate.

У меня есть кнопка, которая переключает режим приложения с рисования на режим масштабирования и панорамирования следующим образом:

если вы хотите нарисовать:

    [scrollView setUserInteractionEnabled:NO];
    [imageView setUserInteractionEnabled:YES];

так что касания управляются методами touchesBegan, touchesMoved, touchesEnded.

если вы хотите панорамировать и масштабировать двумя пальцами с помощью жеста ущипнуть для масштабирования

[scrollView setUserInteractionEnabled:YES]; 
[imageView setUserInteractionEnabled:NO];

так что жест двумя пальцами управляется UIScrollViewDelegate

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

Моя идея заключалась в том, чтобы отследить присутствие двух пальцев в touchesBegan, а затем отключить взаимодействие с пользователем в UIImageView, чтобы включить взаимодействие с пользователем в режиме прокрутки, но проблема в том, что после этого касания по-прежнему управляются методом touchesMoved, ничего приходит к scrollViewDelegate, пока я не уберу пальцы с экрана, после этого, если я снова проведу пальцами по экрану, всем будет управлять scrollViewDelegate.

Итак, подведем итоги: можно ли остановить цикл касаний после touchesBegan и передать его на ScrollViewDelegate?

Если это невозможно, как я могу добиться масштабирования, панорамирования и рисования на UImageView? Следует ли мне удалить прокрутку и попытаться масштабировать и панорамировать UImageView с помощью методов UIResponder?

Спасибо за помощь

Увидев опубликованный вами код, похоже, что вы используете objc, а не Swift, я прав?

regina_fallangi 19.09.2018 15:39

В приложении я использую C#, потому что приложение создано на Xamarin.iOS, но вы правы, я опубликовал код objc. Я собираюсь обновить тег, добавив objc .. Я действительно не возражаю против используемого кода, я могу справиться с обоими.

user6139440 19.09.2018 15:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
93
1

Ответы 1

Попробуйте изменить свою реализацию, чтобы использовать распознаватели жестов вместо обработки касаний с помощью методов UIResponder. Основные преимущества этого подхода:

  • Вы можете использовать UIPanGestureRecognizer для рисования или даже создать пользовательский распознаватель
  • У вас могут быть отношения зависимости между распознавателями, используя requireGestureRecognizerToFail, даже по просмотрам
  • Вы можете перебрать все распознаватели в представлении и отключить только определенный набор жестов, не отключая касания для всего представления.
  • Распознаватели жестов имеют те же методы, связанные с касанием, которые вы можете использовать для перемещения кода обработки касаний из текущей реализации в жесты.

Таким образом, ваше изображение будет иметь либо панорамирование, либо ваш пользовательский распознаватель жестов с одним касанием для рисования, и вы можете прокручивать распознаватели scrollview и отмечать, что они не срабатывают, если срабатывает жест рисования, используя requireGestureRecognizerToFail.

При этом вам не нужно включать / отключать взаимодействие с пользователем в любом из представлений, хотя вам придется сделать это методом проб и ошибок, чтобы все жесты правильно работали друг с другом.

Удачного кодирования :)

Спасибо Swapni, поэтому вы предлагаете отказаться от методов UIResponder для UIPanGestureRecognizer. Я прочитал несколько сообщений о проблемах производительности, связанных с UIPanGestureRecognizer для рисования, знаете ли вы об этом? В любом случае еще раз спасибо .. Я попробую ваше предложение и сообщу о своих результатах здесь.

user6139440 19.09.2018 16:46

Другие вопросы по теме