Я разрабатываю приложение для рисования для 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?
Спасибо за помощь
В приложении я использую C#, потому что приложение создано на Xamarin.iOS, но вы правы, я опубликовал код objc. Я собираюсь обновить тег, добавив objc .. Я действительно не возражаю против используемого кода, я могу справиться с обоими.





Попробуйте изменить свою реализацию, чтобы использовать распознаватели жестов вместо обработки касаний с помощью методов UIResponder. Основные преимущества этого подхода:
Таким образом, ваше изображение будет иметь либо панорамирование, либо ваш пользовательский распознаватель жестов с одним касанием для рисования, и вы можете прокручивать распознаватели scrollview и отмечать, что они не срабатывают, если срабатывает жест рисования, используя requireGestureRecognizerToFail.
При этом вам не нужно включать / отключать взаимодействие с пользователем в любом из представлений, хотя вам придется сделать это методом проб и ошибок, чтобы все жесты правильно работали друг с другом.
Удачного кодирования :)
Спасибо Swapni, поэтому вы предлагаете отказаться от методов UIResponder для UIPanGestureRecognizer. Я прочитал несколько сообщений о проблемах производительности, связанных с UIPanGestureRecognizer для рисования, знаете ли вы об этом? В любом случае еще раз спасибо .. Я попробую ваше предложение и сообщу о своих результатах здесь.
Увидев опубликованный вами код, похоже, что вы используете objc, а не Swift, я прав?