2011-03-03 101 views
2

我是非常非常新的iPhone开发。iPhone自定义用户界面组件

我想创建一个可以包含正方形,圆形或三角形的UI组件。我会传递一个参数给它的构造函数来说它是我想要的形状。

我希望这个物体可以通过acelerometer或用户的手指移动。我也想让它变得更大或更小。我想创建一个继承UIView的自定义UI组件。

我不知道如果我用Quartz 2D绘制一个形状,它将表现得像一个UI组件。

我可以这样做吗?你有更好的解决方案吗?

回答

3

我想简单和规则解决方案继承UIView。正是你要做的。

概念,UIView是通过绘制它们保持其视觉内容。 (在大多数情况下为Quartz!)如果视觉内容改变了? UIView只是重新绘制它们。当你改变任何东西时,UIView重新绘制一切。 (当然,这是概念上的描述,实际是一个很大的不同,因为有重优化)

然而,重要的一点是你有这只是覆盖方法做什么。因为UIKit会执行大多数重要的优化,而不是您。

UIView绘制其可视内容与- (void)drawRect:(CGRect)rect方法。你可以重写这个方法来绘制你的形状。如果在此方法中绘制某个东西,则该形状将绘制在透明视图上。

如果操作视图(缩放,移动,旋转...)UIKit可以要求重新绘制它的图形视图。而且,这个视图会记得绘制你的形状的方法。这是非常规律的技术。大多数使用此方法构建的自定义图形和动画。您所要做的只是在方法- (void)drawRect:(CGRect)rect中编写绘图代码。

是有关于这个概念的参考文档不错指南:

,照顾你必须通过调用UIGraphicsGetCurrentContext ( void );方法,而不是与检索CGContextRef画创造你自己的。上下文表示实际的设备屏幕。如果您创建自己的环境,则它们都不能提供实际的设备屏幕。

举个例子:

@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做了基本的优化,但不是全部。由于图形优化在内存和处理之间有很多折衷。您可以从CALayershouldRasterize获得一些优化。但是,如果您需要更多,则必须开始研究实时图形。

+3

“这是”意思是“它是”顺便说一句。 http://garyes.stormloader.com/its.html – occulus 2011-03-03 12:14:49

+0

@occulus哇!我非常感谢!总是欢迎纠正我错误的语法:) – Eonil 2011-03-03 12:33:06

+0

@occulus:语法的很好的来源! – VansFannel 2011-03-03 12:58:10

0

Eonil所描述的绘制自定义视图当然是可能的。但是,你有没有考虑过简单地使用UIImageView