`

用CALayer绘图

 
阅读更多

在iOS中绘图,可以使用UIView,也可以使用CALayer。实际上,UIView也是由底层的CALayer完成绘制的工作
<!--more-->

UIView和CALayer的关系

每个UIView内部都有一个CALayer对象,由它来完成绘制的工作。和view一样,layer也是一个树形的结构

当不需要自定义组件的时候,用UIView的API就足以胜任,把需要的子view通过addSubview()方法放到view的层次里即可;但是如果需要自己绘制一些图形,就需要在UIView的drawRect()方法或是CALayer的相关方法中,调用CoreGraphics的API来画图

跟几个朋友也讨论过这个问题,我认为用layer来画是更好的办法,因为相对于view,layer是更轻量级的组件,可以节省系统资源。同时layer是动画的基本单元,加动画特效也更容易。并且view负责响应手势等,把绘制的代码都放在layer里,逻辑上也更加清晰

但是需要注意,layer不能直接响应触摸事件,所以手势识别还是需要通过view来完成

在UIView中绘图

在UIView中绘图非常简单,当调用

self.setNeedsDisplay()

iOS系统会自动调用view上的drawRect()方法,可以在drawRect()方法中绘制图形

在CALayer中绘图

在layer中绘图,生命周期比view复杂一些

首先也是调用layer上的setNeedsDisplay()触发的

display

首先会进入layer的display()方法,在这里可以把CGImage赋给layer的contents,那么会直接把该CGImage作为此layer的样式,不会进入后续的方法

// 绘图方法
override func display() {

    if let img = getFrameImage(wheelStyle) {
        contents = img.CGImage
    }        
}

displayLayer

如果没有实现display()方法,或者调用了super.display(),并且设置了layer的delegate,那么iOS系统会调用delegate的displayLayer()方法

let myLayer : MyLayer = MyLayer()
myLayer.delegate = self;
myLayer.frame = bounds;
override func displayLayer(layer: CALayer) {

    if let img = getFrameImage(wheelStyle) {
        contents = img.CGImage
    }
}

drawInContext

如果没有设置delegate,或者delegate没有实现displayLayer()方法,那么接下来会调用layer的drawInContext方法

override func drawInContext(ctx: CGContext) {

    CGContextSetLineWidth(ctx, 1);
    CGContextMoveToPoint(ctx, 80, 40);
    CGContextAddLineToPoint(ctx, 80, 140);
    CGContextStrokePath(ctx);
}

drawLayerInContext

如果layer没有实现drawInContext方法,那么接下来就会调用delegate的drawLayerInContext方法

override func drawLayer(layer: CALayer, inContext ctx: CGContext) {
    CGContextSetLineWidth(ctx, 1);
    CGContextMoveToPoint(ctx, 80, 40);
    CGContextAddLineToPoint(ctx, 80, 140);
    CGContextStrokePath(ctx);
}

总结

所以,一般来说,可以在layer的display()或者drawInContext()方法中来绘制

在display()中绘制的话,可以直接给contents属性赋值一个CGImage,在drawInContext()里就是各种调用CoreGraphics的API

假如绘制的逻辑特别复杂,希望能从layer中剥离出来,那么可以给layer设置delegate,把相关的绘制代码写在delegate的displayLayer()和drawLayerInContext()方法。这2个方法与display()和drawInContext()是分别一一对应的

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    ios-自定义CALayer.zip

    总之,"ios-自定义CALayer.zip"是一个很好的起点,它让开发者了解如何使用CALayer进行自定义绘图和动画。通过学习和实践,你可以创造出更多令人惊叹的视觉效果,并掌握iOS开发中的一个重要技术领域。

    图层CALayer的一些知识

    `CALayer`不仅仅是一个绘图对象,还提供了丰富的动画功能,使得开发者能够创建出流畅、高性能的用户界面。下面我们将深入探讨`CALayer`的一些关键知识点。 ### 自定义图层 自定义图层是`CALayer`的一个强大特性,...

    iOS开发中CALayer使用的基本教程

    CALayer是UIView背后的绘图引擎,尽管我们通常与UIView交互,但真正的图形渲染和动画处理都在其对应的CALayer上进行。 **一、CALayer的基本概念** 1. **UIView与CALayer的关系**: - UIView是iOS界面元素的基础,...

    ios-CALayer.zip

    在iOS开发中,CALayer是Core Animation框架的核心组成部分,它是一种轻量级的绘图对象,用于构建和管理UI元素的视觉表示。本教程通过"ios-CALayer.zip"压缩包,提供了一些基础的CALayer用法,帮助开发者更好地理解和...

    CALayer简单教程

    每个`UIView`都有一个关联的`CALayer`,视图的所有绘图操作都在这个层上进行。例如,通过引入`QuartzCore`框架并引用`#import &lt;QuartzCore/QuartzCore.h&gt;`,可以在`UIViewController`的`viewDidLoad`方法中设置`...

    [Cocoa]_[画图]

    例如,可以使用CGContextMoveToPoint、CGContextAddLineToPoint等函数定义路径,然后用CGContextStrokePath填充这条路径。此外,还可以设置颜色(如用CGColorSetRGBFillColor或CGColorSetRGBStrokeColor),调整线宽...

    swift-ZMCALayerAnimationiOS绘图和动画

    3. **Layer Animation**: 在ZM_CALayerAnimation项目中,我们将学习如何使用CALayer创建自定义动画。这包括改变图层的属性(如位置、大小、透明度等)以及使用关键帧动画、路径动画等高级技巧。 4. **图片处理**:...

    DrawDemo2绘图源码_ios源码

    6. CALayer与UIView:虽然DrawDemo2主要使用Core Graphics进行绘图,但iOS中另一个关键的绘图组件是CALayer。CALayer是UI视图的基础,可以独立于UIView进行绘图,提供更高效的性能。在某些情况下,开发者可能会选择...

    绘图源码_ios源码

    7. **保存和加载绘图**:为了保存用户的创作,开发者需要将绘图内容序列化存储,可能采用PNG、JPEG格式保存图像,或者使用Core Data或SQLite数据库存储更复杂的绘图数据,如路径、颜色信息等。同时,还需要提供加载...

    ios绘图与动画

    在iOS中,我们可以使用Core Graphics和UIKit框架来实现自定义绘图。Core Graphics,也被称为Quartz 2D,提供了一个低级的绘图API,允许开发者直接控制图形的每一个像素。通过这个框架,你可以绘制直线、曲线、矩形、...

    iOS优雅的将CALayer旋转360度示例代码

    当UIView需要显示到屏幕上时,会调用 drawRect:方法进行绘图,并且会将所有内容绘制在自己的层上,绘图完毕后,系统会将层拷贝到屏幕上,于是就完成了UIView的显示。 * 换句话说,UIView本身不具备显示

    iOS CoreGraphics绘图

    - **CALayer绘图**: CALayer同样支持Core Graphics绘图,且性能更优,适合用于复杂的动画效果。 - **CATextLayer和CAGradientLayer**: 分别用于绘制文本和渐变,简化了特定图形的创建。 5. **示例代码** - `...

    DrawTransformer绘图源码_ios源码

    4. 图层管理:使用图层概念,便于管理和编辑多个绘图元素,保持绘图的层次结构清晰。 三、关键代码解析 1. 触摸事件处理:通过UIPanGestureRecognizer、UIPinchGestureRecognizer等手势识别器捕获用户触摸事件,...

    quartz2D绘图代码(使用路径)

    Quartz 2D的路径功能常与其他技术结合,如Core Animation的CALayer,可以实现动画效果,或者与UIKit的UIBezierPath一起使用,以适应iOS应用开发的更高层级接口。 总的来说,Quartz 2D的路径功能为开发者提供了极大...

    曲线绘图Demo

    Core Animation则更适合动画和交互,可以通过CALayer进行离屏渲染,提升性能。 3. **UIScrollView嵌套**:在处理大量数据绘图时,可能需要滚动界面查看全部内容。通过嵌套UIScrollView,可以实现水平和垂直方向的...

    ios-图片遮罩层-Swift.zip

    1、CALayer 、 CAShapeLayer 什么是CALayer? CALayer(这里简单地称其为层)。 首先要说的是CALayers 是屏幕上的一个具有可见内容的矩形区域,每个UIView都有一个根CALayer ...使用UIBezierPath绘制图形

    简单的绘图实现

    - 也可以考虑使用`CGContextSaveGState`和`CGContextRestoreGState`来保存和恢复绘图状态,以便在多个操作之间保持一致性。 5. **优化性能**: - 避免在`drawRect:`中进行复杂的计算或频繁调用,因为这会导致重绘...

    CGDrawKit绘图源码_ios源码

    虽然CGDrawKit主要基于Core Graphics,但iOS开发通常会结合使用CALayer来管理视图的绘图内容。CGDrawKit可能通过扩展CALayer或使用Core Animation来实现更复杂的动画和交互效果。 8. **触摸事件处理**: 在iOS...

Global site tag (gtag.js) - Google Analytics