【问题标题】:iPhone custom ui componentsiPhone自定义ui组件
【发布时间】:2011-03-03 10:10:06
【问题描述】:

我对 iPhone 开发非常陌生。

我想创建一个可以包含正方形、圆形或三角形的 ui 组件。我会给它的构造函数传递一个参数,告诉它我想要什么样的形状。

我希望这个对象可以通过加速度计或用户的手指移动。我也想让它变大或变小。

我想创建一个继承 UIView 的自定义 UI 组件。

我不知道如果我用 Quartz 2D 绘制一个形状,它的行为会像一个 UI 组件。

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

【问题讨论】:

    标签: iphone uiview custom-controls


    【解决方案1】:

    我认为简单而常规的解决方案是子类化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 做了基本的优化,但不是全部。因为图形优化在内存和处理之间有很多权衡。您可以从CALayer 和shouldRasterize 获得一些优化。但是,如果您需要更多,则必须开始研究实时图形。

    【讨论】:

    • @oculus 哇!我很感激!总是欢迎纠正我的错误语法:)
    • @occulus:语法的重要来源!
    【解决方案2】:

    当然可以像 Eonil 描述的那样绘制自定义视图。但是,您是否考虑过简单地使用UIImageView?

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 2018-11-23
      • 2020-04-16
      • 1970-01-01
      相关资源
      最近更新 更多