我对iPhone开发非常新。
我想创建一个可以包含正方形,圆形或三角形的ui组件。我将一个参数传递给它的构造函数,说它是我想要的形状。
我希望这个对象可以通过acelerometer或用户的手指移动。我也想把它变大或变小。
我曾想过创建一个继承UIView的自定义UI组件。
我不知道我是否使用Quartz 2D绘制一个形状,它的行为就像一个UI组件。
我能这样做吗?你有更好的解决方案吗?
答案 0 :(得分:3)
我认为简单和常规的解决方案是继承UIView
。正是你要做的事。
从概念上讲,UIView
通过绘制它们来保持其视觉内容。 (在大多数情况下Quartz
!)如果视觉内容发生了变化? UIView
只是重新绘制它们。当你改变任何东西时,UIView
重新绘制一切。 (当然,这是概念性的描述,因为有很多优化,所以实际上有很多不同)
但重要的是,你必须做的就是覆盖一个方法。因为UIKit
执行了大多数重要的优化,而不是你。
UIView
使用- (void)drawRect:(CGRect)rect
方法绘制其可视内容。您可以覆盖此方法来绘制形状。如果您在此方法中绘制内容,则将在透明视图上绘制形状。
如果您操纵视图(缩放,移动,旋转......)UIKit
可能会请求视图重绘其图形。并且,视图将回想起绘制形状的方法。这是非常规律的技术。使用此方法构建的大多数自定义图形和动画。您所要做的就是在方法- (void)drawRect:(CGRect)rect
中编写绘图代码。
在参考文档中有关于此概念的良好指南:
请注意,您必须通过调用CGContextRef
方法检索UIGraphicsGetCurrentContext (
void
);
而不是创建自己的方法。上下文表示实际设备屏幕。如果您创建自己的上下文,则它们都不能提供实际的设备屏幕。
举个例子:
@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
获得一些优化。但是,如果您需要更多,则必须开始研究实时图形。
答案 1 :(得分:0)
当Eonil描述时,当然可以绘制自定义视图。但是,您是否考虑过使用UIImageView
?