Cocoa触摸视图与多个相同的子视图

时间:2010-02-12 14:05:51

标签: iphone cocoa cocoa-touch model-view-controller ipad

我第一次涉足Cocoa Touch编程(我的第一次进入Cocoa)并为iPhone编写了一个简单的游戏,尽管这个问题一般都是关于可可触摸的。

主UI包含一条相同的动作按钮(只有颜色不同),横跨屏幕排列。虽然它们像按钮一样,但需要具有自定义绘制外观。每个人都以相同的方式响应触摸事件,触发应用程序中的其他事件。

我想定义一个自定义视图,部分是为了更好地控制行为,而不仅仅是拥有一堆标准按钮,部分是为了更多地了解可可编程。

  • 我应该定义一个带有子视图数组的主视图,每个子视图都会绘制自己并转发触摸事件吗?每个按钮都应该执行标准操作,例如触摸时显示按下状态等等。对于这种情况,是否存在任何预先存在的容器视图?

  • 或者我应该只定义一个主视图来绘制整个条带并检测触摸发生的位置?我觉得这是一个设计糟糕的方法 - 我不应该编程命中测试代码


编辑澄清问题

4 个答案:

答案 0 :(得分:1)

您应该使用一组子视图 - 这样每个“按钮”类都知道如何绘制自己,并且其超级视图(您声明的“主视图”)将按钮放置在需要的位置。

在NDA上排名第二:只谈iPhone。

答案 1 :(得分:1)

如果您有很多按钮并且希望用它们做一些奇特的事情,我推荐使用layers。你的UIView将处理解释哪一层有触摸(命中测试)和  适当回应。如果您所做的只是管理具有各种效果和动画的整串按钮,这可能是一条更容易的路线。

至于糟糕的工程,完全没有。如果您查看相关指南,您会看到核心动画和图层确实需要命中测试(虽然这相对简单),但它比UIView做的所有绘图更清晰,并且比许多子视图更有效。它很好地在这两种方法之间滑动。

完全披露:我只是围绕如何最好地利用这些东西,但是对于更复杂的交互式控制。

答案 2 :(得分:1)

更轻量级的方法是将子图层添加到UIView的图层。使用hitTest:将你在UIView上收到的触摸发送给需要接收它的CALayer实例。

如果您需要更多的UIResponder行为(touchesBegan等),您可能希望使用子视图而不是子图层,因为这样可以直接在对象中处理事件,而不必从中央响应者发送它们(你的主要UIView)。

因此,基本位可能是您的主要UIView应该知道(处理)与您的各个按钮相关的行为。如果从中心位置控制所有内容是有意义的,您可以将所有逻辑放在UIView中,并使用子层来实现轻量级显示。如果将行为放入按钮本身更有意义,那么它们应该是UIResponders,并且作为子类UIView,并作为主视图的子视图添加。

答案 3 :(得分:0)

您可以在Interface Builder中布局视图。只需在视图控制器的视图中拖动一堆UIButton

要响应事件,请在视图控制器中定义IBAction并将按钮连接到它。

这一切都非常基础。我真的建议你至少要完成Apple在线的iPhone编程介绍。它将教你iPhone和Interface Builder的基础知识。