多个UIGestureRecognizer和UIScrollView导致冲突

时间:2010-12-11 19:53:03

标签: iphone uiview ios4 uiscrollview uigesturerecognizer

我正在开发一款游戏,您可以将其与拼图游戏进行比较,其中我有几个游戏牌将在表面上相互匹配(后来称为“主视图”)。在游戏开始时,瓷砖将被放置在IViewView的MainView下。我用平移手势移动瓷砖。我通过使用点击手势选择一个图块,最后我需要能够使用旋转手势旋转我执行此操作的图块。这导致了我设法解决的一些问题,但我不得不将磁贴放在UIScrollView中,因为我必须能够同时显示所有这些问题。

我做了几个不同的实现,它们都引起了一些问题。我会尝试不同的方法。

方法1.平移,点击 - >平铺,旋转 - >的MainView

首先,我将点击和平移识别器放在游戏磁贴和主视图中的旋转手势中,因为磁贴很小,可以执行旋转手势。当我意外地按下另一个磁贴时,我发生了冲突旋转手势然后该图块将其解释为平移手势。这导致我尝试了一种新方法。

方法2.平移,点击,旋转 - >的MainView

我的第二种方法是将所有手势识别器放在MainView中。然后每次识别手势时,我通过调用CGRectContainsPoint([gameTile frame],gesturePoint)检查点击和平移手势的位置是否有图块;

然后在旋转手势之前我检查是否选择了图块然后调用相应的方法。这很棒!但后来我意识到我必须有一些机制让我有更多的瓷砖然后可以在整个屏幕上显示。所以我添加了一个UIScrollView,我在那里水平放置了瓷砖,所以都可以访问。我在下面画了一张小图。

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

然后我将GameTiles作为子视图添加到scrollview中,以便它们可以随视图滚动。然后他们不再听我的触摸,因为他们不是我的MainView的子视图。所以现在我处于一种僵局,我不知道该怎么做。如果我回到接近1并且为UIScrollView设置canCancelContentTouches = NO,我可以移动切片。但是我会再次遇到旋转手势的问题,并且必须进行一些碰撞检测,以便我可以将图块从滚动视图移动到主视图。

我已经阅读了很多有关此问题的不同帖子,但我还没有理解它。

任何人都可以给我一些关于UIScrollView的指示,它允许我有50个不会弄乱我的触摸并且仍然允许它们具有合理尺寸的瓷砖,因此我可以在它们上使用手势识别器。或者如何将瓷砖从UIScrollView平滑地移动到MainView上,并且仍然可以旋转瓷砖而无需平移其他瓷砖。

1 个答案:

答案 0 :(得分:1)

我对您的问题没有确切的答案,但这些提示可能有所帮助:

  1. 手势事件总是流向最深层嵌套的视图

  2. 您可以继承GestureRecognizer并覆盖方法“ignoreTouch:forEvent:”以有条件地忽略事件并解决冲突。 (就在你的第一个 尝试 - 您可能希望在轮换进行时忽略点按)

  3. I recently learned this stuff by watching the Apple WWDC videos referenced in this answer.

    该演讲的特点是可以移动,缩放和旋转的多个对象。

    Apple example code for same