Несколько UIGestureRecognizer и UIScrollView вызывают конфликты - PullRequest
1 голос
/ 11 декабря 2010

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

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

Подход 1. Pan, Tap -> Tile, Rotate -> 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 и по-прежнему иметь возможность вращать плитки без панорамирования других плиток.

1 Ответ

1 голос
/ 04 мая 2012

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

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

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

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

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

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

...