我对 iPhone 开发非常陌生。
我想创建一个可以包含正方形、圆形或三角形的 ui 组件。我将向其构造函数传递一个参数来说明我想要什么样的形状。
我希望这个对象可以通过加速度计或用户的手指移动。我也想把它变大或变小。
我想过创建一个继承 UIView 的自定义 UI 组件。
我不知道如果我用 Quartz 2D 绘制一个形状,它的行为会像 UI 组件一样。
我可以这样做吗?您有更好的解决方案吗?
最佳答案
我认为简单而常规的解决方案是子类化UIView
。这正是您要做的。
从概念上讲,UIView
通过绘制它们来保留其视觉内容。 (大多数情况下使用Quartz
!)视觉内容是否发生变化? UIView
只是重新绘制它们。当您更改任何内容时,UIView
会重新绘制所有内容。 (当然,这是概念性描述,实际情况有很大差异,因为有大量优化)
然而,重要的一点是你所要做的只是重写一个方法。因为 UIKit
代替您完成了大部分重要的优化。
UIView
使用 - (void)drawRect:(CGRect)rect
方法绘制其视觉内容。您可以重写此方法来绘制形状。如果您在此方法中绘制某些内容,该形状将绘制在透明 View 上。
如果您操作 View (缩放、移动、旋转...)UIKit
可能会请求 View 重绘其图形。并且, View 将调用绘制形状的方法。这是非常常规的技术。大多数自定义图形和动画都是用这种方法构建的。您所要做的只是在方法 - (void)drawRect:(CGRect)rect
中编写绘图代码。
引用文档中有关于这个概念的很好的指南:
- http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html%23//apple_ref/doc/uid/TP40006816-CH3-BBCDGJHF
- http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews.html%23//apple_ref/doc/uid/TP40009503-CH5-SW23
并且请注意,您必须使用通过调用 UIGraphicsGetCurrentContext (
空白
);
方法而不是创建您自己的方法。上下文指的是实际设备屏幕。如果您创建自己的上下文,则它们都无法提供实际的设备屏幕。
举个例子:
@interface MyView : UIView
@end
@implementation MyView
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
// Do your drawing here with the `context`.
// And don't release it because the it is not yours, just borrowed from `UIKit`.
}
@end
也许您需要某种形式的优化。 UIKit
进行基本优化,但不是全部。因为图形优化在内存和处理之间有很多权衡。您可以从 CALayer
和 shouldRasterize
获得一些优化。但是,如果您需要更多,则必须开始研究实时图形。
关于iPhone 自定义 ui 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5179255/