1

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

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

方法 1. 平移、点击 -> 平铺、旋转 -> 主视图

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

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

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

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

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

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

我已经阅读了很多关于这个问题的不同帖子,但我还无法理解它。

谁能给我一些关于另一种方式的指示,然后是 UIScrollView,它允许我拥有 50 个不会干扰我的触摸的图块,并且仍然允许它们具有合理的大小,以便我可以在它们上使用手势识别器。或者如何将 tile 从 UIScrollView 平滑地移动到 MainView 并且仍然能够在不平移其他 tile 的情况下旋转 tile。

4

1 回答 1

1

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

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

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

我最近通过观看此答案中引用的 Apple WWDC 视频了解了这些内容。

该演讲包含多个可以移动、缩放和旋转的对象。

相同的 Apple 示例代码

于 2012-05-04T16:10:06.513 回答