Несколько UIGestureRecognizer и UIScrollView вызывают конфликты

Я разрабатываю игру, которую вы можете сравнить с головоломкой, где у меня есть несколько игровых плиток, которые будут сопоставляться друг с другом на поверхности (позже называемой MainView). В начале игры плитки будут размещены под MainView в IdleView. Я перемещаю плитки жестом панорамирования. Я выбираю плитку с помощью жеста касания, и, наконец, мне нужно иметь возможность вращать плитки. Я делаю это с помощью жеста поворота. Это вызвало некоторые проблемы, которые мне удалось решить, но затем мне пришлось поместить плитки в UIScrollView, так как мне нужно много, чтобы иметь возможность отображать их все сразу.

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

Подход 1. Панорама, Коснитесь -> Плитка, Поверните -> MainView

Сначала я поместил распознаватели касания и панорамирования в плитку игры, а жест поворота — в основной вид, потому что плитки слишком малы для выполнения жеста поворота. Затем у меня возник конфликт, когда я случайно нажал другую плитку, когда выполнял жест поворота. а затем эта плитка интерпретировала это как жест панорамирования. Это привело к тому, что я попробовал новый подход.

Подход 2. Панорамирование, касание, поворот -> MainView

Мой второй подход заключался в том, чтобы поместить все распознаватели жестов в MainView. Затем каждый раз, когда распознается жест, я проверяю, есть ли плитка в месте для жестов касания и панорамирования, вызывая CGRectContainsPoint([gameTile frame],gestPoint);

Затем перед жестом вращения я проверяю, выбрана ли плитка, а затем вызываю соответствующие методы. Это сработало отлично! Но потом я понял, что должен иметь какой-то механизм, позволяющий мне иметь больше плиток, чем можно отобразить на весь экран. Поэтому я добавил UIScrollView, где я разместил плитки горизонтально, чтобы все было доступно. Ниже я сделал небольшой рисунок.

---------------------
|                   |
|                   |
|                   |
|    Height 370 p   |
|                   |
|      MainView     |
|                   |
|                   |
|                   |
|                   |
|                   |
|                   |
---------------------
|     Height 110 p  |
|      IdleView     |
|     UIScrollView  |
|                   |
|                   |
---------------------

Затем я добавил GameTiles в качестве подвидов в вид прокрутки, чтобы они прокручивались вместе с представлением. Затем они больше не слушали мои прикосновения, так как они не были подвидами моего MainView. Так что теперь я в некотором тупике, где я больше не знаю, что делать. Я могу перемещать плитки, если вернусь к подходу 1 и установлю canCancelContentTouches = NO для UIScrollView. Но тогда у меня снова возникнут проблемы с жестом поворота, и мне придется выполнить некоторое обнаружение столкновений, чтобы я мог переместить плитку из прокрутки в основное представление.

Я прочитал много разных сообщений об этой проблеме, но я еще не смог понять это.

Может ли кто-нибудь дать мне несколько указателей на любой другой способ, чем UIScrollView, который позволяет мне иметь около 50 плиток, которые не путаются с моими прикосновениями, и при этом позволяют им иметь разумный размер, чтобы я мог использовать на них распознаватели жестов. Или как плавно переместить плитку из UIScrollView в MainView и по-прежнему иметь возможность вращать плитки без панорамирования других плиток.


person ehenrik    schedule 11.12.2010    source источник


Ответы (1)


У меня нет точного ответа на ваш вопрос, но эти советы могут помочь:

  1. события жестов всегда переходят к наиболее глубоко вложенному представлению

  2. вы можете подклассировать GestureRecognizer и переопределить метод «ignoreTouch: forEvent:», чтобы условно игнорировать события и разрешать конфликты. (как и в вашей первой попытке - вы можете игнорировать нажатия во время вращения)

Я недавно узнал об этом, посмотрев видеоролики Apple WWDC, упомянутые в этом ответе.

В беседе представлены несколько объектов, которые можно перемещать, масштабировать и вращать.

Пример кода Apple для того же< /а>

person nont    schedule 04.05.2012