iPhone 自定义 ui 组件

标签 iphone uiview custom-controls

我对 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 中编写绘图代码。

引用文档中有关于这个概念的很好的指南:

并且请注意,您必须使用通过调用 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 进行基本优化,但不是全部。因为图形优化在内存和处理之间有很多权衡。您可以从 CALayershouldRasterize 获得一些优化。但是,如果您需要更多,则必须开始研究实时图形。

关于iPhone 自定义 ui 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5179255/

相关文章:

iphone - UILabel 设置透明背景颜色?

swift - 使用 userDefaults 保存 UIView

javascript - 为什么我的 View 没有按预期重新渲染?

c# - 如何使用 GraphicsPath 绘制形状来创建自定义控件的区域?

ios - ios 上的自定义控件(条目中的示例)

iphone - 如何在 iPhone 中捕捉视频

iOS, subview 大小无故改变

iphone - 如果 NSMutableArray 已经被属性和合成方法覆盖,我是否需要手动创建它? (附代码)

ios - 如何用渐变颜色填充贝塞尔曲线路径

ios - 可以将委托(delegate)变量分配给调用对象吗?