假设我想制作一个类似于这个应用程序中的拨号控件:http://store.apple.com/ us / product / H2654LL / A 。
我应该从哪里开始?
- 我需要子类化UIView并对其进行自定义吗? - 我需要使用Quartz 2D吗? - 我需要使用OpenGL ES来将此类内容绘制到屏幕上吗? - 我可以继续使用IB来设计/布局我的自定义视图吗?
我只是有点困惑应该怎么走。
是的 - 这个问题已经被问过并回答过几次了,但是我尚未找到令人满意的答案,可以解决上述问题。
需要继承的类
与其继承UIView
,您可能更希望继承UIControl
。该类内置了Target/Action模式的功能,可用于响应您的自定义控件生成的操作。UIKit上的大多数元素(如按钮和滑块)都出于这个特定的原因而继承自UIControl
。
可视化子类 绘图实际上取决于您想要实现什么以及您想要动画的部分是什么。您可以根据需要或喜好使用图像、使用石英或OpenGL进行绘制。只需使用最简单的方法来实现所需的效果即可。多个图像可以用于处理不同状态(按下等),或者用于精灵动画。CALayer很容易旋转或移动。
无论您使用哪种技术,您都可能使用传入的触摸事件来控制动画。例如,在拨号控件的情况下,您会基于y坐标移动来控制旋转量。
举例说明:例如,如果我的控件只需要在按下时更改,则使用图像进行交换。我也喜欢经常使用CALayer
,它为您提供了生成边框、遮罩、渐变和圆角的简单方式,这些都可以轻松进行动画处理。
在Interface Builder中使用 在桌面上使用Cocoa时,可以为自定义控件构建自定义IB工具栏。iOS从未拥有过这种功能,而我认为Xcode 4没有可用的IB插件。
因此,当前处理自定义子类的唯一方法是在IB中使用UIView
,并在Identity Inspector中设置“Custom class”字段为您自定义类的名称。这样,您就有了一个可以布局和调整大小的视图。在Interface Builder中,它只是一个矩形;当运行应用程序时,XIB实际上将该视图反序列化为您的自定义类。
使用UIControl
时,您可以免费获得目标/操作机制。因此,您可以像使用任何其他标准UIKit控件一样,在IB中将触摸事件连接到任何对象。
需要注意的一点是:如果你有自定义的 - initWith...
选择器,这些选择器将不会被调用。因为你的类是从XIB反序列化过来的,所以应该使用- initWithCoder:(NSCoder *)aDecoder;
进行初始化。