2010-12-11 40 views
1

在开发一个游戏,你可以比较一个拼图游戏,我有几个游戏拼图将在表面上相互匹配(后来引用为MainView)。在游戏开始时,瓷砖将被置于IdleView下的MainView下。我用平移手势移动瓷砖。我通过使用轻击手势选择一个贴图,最后我需要能够旋转我使用旋转手势进行的贴图。这导致了一些我设法解决的问题,但是之后我必须将这些图块放在UIScrollView中,因为我必须多次才能够一次显示它们。多UIGestureRecognizer和UIScrollView导致冲突

我做了几个不同的实现,他们都造成了一些问题。我会经历我尝试的不同方法。

接近1潘,点击 - >瓷砖,旋转 - >的MainView

首先,我把水龙头和锅识别在游戏瓷砖和我的主视图旋转手势,因为瓷砖是小执行一个旋转的手势。然后我发生了一个冲突,当我意外地按下另一个瓦片时,我做了旋转手势,然后该瓦片将其解释为一个平移手势。这导致我尝试了一种新方法。

方法2,潘,点击,旋转 - >的MainView

我的第二个方法是把所有手势识别器的的MainView。然后每次识别一个手势,我通过调用CGRectContainsPoint([gameTile frame],gesturePoint)来检查是否在tap和pan手势的位置有一个tile。

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

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

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

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

任何人都可以给我一些其他方式的指针,然后是一个UIScrollView,允许我有50块瓷砖不会混淆我的触摸,并仍然允许他们有一个合理的大小,所以我可以使用他们的手势识别器。或者如何平滑地将UIScrollView上的图块移动到MainView上,并且仍然能够旋转图块而不需要平移其他图块。

回答

1

我没有一个确切的回答你的问题,但这些技巧可以帮助:

  1. 的手势事件总是流向最深层的看法

  2. ,那么可以继承一个GestureRecognizer并重写方法“ignoreTouch:forEvent:”来有条件地忽略事件并解决冲突。(如您的第一个 尝试 - 你可能要忽略的水龙头,而旋转是怎么回事)

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

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

Apple example code for same