0

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

主 UI 由一条在屏幕上水平排列的相同作用按钮(仅颜色不同)组成。尽管它们的行为类似于按钮,但它们需要具有自定义绘制的外观。每个都以相同的方式响应触摸事件,触发应用程序中的其他事件。

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

  • 我应该用一组子视图定义一个主视图,每个子视图都会自己绘制并转发触摸事件?每个按钮都应该做一些标准的事情,比如在触摸时显示按下状态等等。这种场景是否有任何预先存在的容器视图?

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


编辑以澄清问题

4

4 回答 4

1

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

第二个关于 NDA 的问题:只谈 iPhone。

于 2010-02-12T14:59:56.087 回答
1

如果你有很多按钮并且想用它们做一些花哨的事情,我建议使用layers。您的 UIView 将处理解释哪个层有触摸(命中测试)并做出适当的响应。如果您所做的只是管理一大堆具有各种效果和动画的按钮,那么这可能是一条更简单的路线。

至于糟糕的工程,一点也不。如果你看一下相关的指南,你会看到核心动画和图层确实需要命中测试(虽然这相对容易),但它比 UIView 做所有的绘图要干净得多,并且比许多子视图更有效。它很好地介于这两种方法之间。

完全披露:我只是在思考如何自己最好地利用这些东西,但是对于更复杂的交互式控件。

于 2010-02-12T15:22:09.727 回答
1

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

如果您需要更多 UIResponder 行为(touchesBegan 等),您可能希望使用子视图而不是子层,因为这将允许您直接在对象中处理事件,而不必从中央响应者(您的主要界面视图)。

因此,重要的一点可能是您的主 UIView 应该知道(处理)多少与您的各个按钮相关的行为。如果从一个中心位置控制一切是有意义的,您可以将所有逻辑放在 UIView 中,只使用子层进行轻量级显示。如果将行为放入按钮本身更有意义,它们应该是 UIResponders 并因此子类 UIView 并添加为主视图的子视图。

于 2010-02-12T16:09:10.173 回答
0

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

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

这都是非常基本的。我真的建议您至少浏览一下Apple在线的iPhone编程介绍。它将教你 iPhone 和 Interface Builder 基础知识。

于 2010-02-12T14:23:25.790 回答