在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"是一个很好的起点,它让开发者了解如何使用CALayer进行自定义绘图和动画。通过学习和实践,你可以创造出更多令人惊叹的视觉效果,并掌握iOS开发中的一个重要技术领域。
`CALayer`不仅仅是一个绘图对象,还提供了丰富的动画功能,使得开发者能够创建出流畅、高性能的用户界面。下面我们将深入探讨`CALayer`的一些关键知识点。 ### 自定义图层 自定义图层是`CALayer`的一个强大特性,...
CALayer是UIView背后的绘图引擎,尽管我们通常与UIView交互,但真正的图形渲染和动画处理都在其对应的CALayer上进行。 **一、CALayer的基本概念** 1. **UIView与CALayer的关系**: - UIView是iOS界面元素的基础,...
在iOS开发中,CALayer是Core Animation框架的核心组成部分,它是一种轻量级的绘图对象,用于构建和管理UI元素的视觉表示。本教程通过"ios-CALayer.zip"压缩包,提供了一些基础的CALayer用法,帮助开发者更好地理解和...
每个`UIView`都有一个关联的`CALayer`,视图的所有绘图操作都在这个层上进行。例如,通过引入`QuartzCore`框架并引用`#import <QuartzCore/QuartzCore.h>`,可以在`UIViewController`的`viewDidLoad`方法中设置`...
例如,可以使用CGContextMoveToPoint、CGContextAddLineToPoint等函数定义路径,然后用CGContextStrokePath填充这条路径。此外,还可以设置颜色(如用CGColorSetRGBFillColor或CGColorSetRGBStrokeColor),调整线宽...
3. **Layer Animation**: 在ZM_CALayerAnimation项目中,我们将学习如何使用CALayer创建自定义动画。这包括改变图层的属性(如位置、大小、透明度等)以及使用关键帧动画、路径动画等高级技巧。 4. **图片处理**:...
6. CALayer与UIView:虽然DrawDemo2主要使用Core Graphics进行绘图,但iOS中另一个关键的绘图组件是CALayer。CALayer是UI视图的基础,可以独立于UIView进行绘图,提供更高效的性能。在某些情况下,开发者可能会选择...
7. **保存和加载绘图**:为了保存用户的创作,开发者需要将绘图内容序列化存储,可能采用PNG、JPEG格式保存图像,或者使用Core Data或SQLite数据库存储更复杂的绘图数据,如路径、颜色信息等。同时,还需要提供加载...
在iOS中,我们可以使用Core Graphics和UIKit框架来实现自定义绘图。Core Graphics,也被称为Quartz 2D,提供了一个低级的绘图API,允许开发者直接控制图形的每一个像素。通过这个框架,你可以绘制直线、曲线、矩形、...
当UIView需要显示到屏幕上时,会调用 drawRect:方法进行绘图,并且会将所有内容绘制在自己的层上,绘图完毕后,系统会将层拷贝到屏幕上,于是就完成了UIView的显示。 * 换句话说,UIView本身不具备显示
- **CALayer绘图**: CALayer同样支持Core Graphics绘图,且性能更优,适合用于复杂的动画效果。 - **CATextLayer和CAGradientLayer**: 分别用于绘制文本和渐变,简化了特定图形的创建。 5. **示例代码** - `...
4. 图层管理:使用图层概念,便于管理和编辑多个绘图元素,保持绘图的层次结构清晰。 三、关键代码解析 1. 触摸事件处理:通过UIPanGestureRecognizer、UIPinchGestureRecognizer等手势识别器捕获用户触摸事件,...
Quartz 2D的路径功能常与其他技术结合,如Core Animation的CALayer,可以实现动画效果,或者与UIKit的UIBezierPath一起使用,以适应iOS应用开发的更高层级接口。 总的来说,Quartz 2D的路径功能为开发者提供了极大...
Core Animation则更适合动画和交互,可以通过CALayer进行离屏渲染,提升性能。 3. **UIScrollView嵌套**:在处理大量数据绘图时,可能需要滚动界面查看全部内容。通过嵌套UIScrollView,可以实现水平和垂直方向的...
1、CALayer 、 CAShapeLayer 什么是CALayer? CALayer(这里简单地称其为层)。 首先要说的是CALayers 是屏幕上的一个具有可见内容的矩形区域,每个UIView都有一个根CALayer ...使用UIBezierPath绘制图形
- 也可以考虑使用`CGContextSaveGState`和`CGContextRestoreGState`来保存和恢复绘图状态,以便在多个操作之间保持一致性。 5. **优化性能**: - 避免在`drawRect:`中进行复杂的计算或频繁调用,因为这会导致重绘...
虽然CGDrawKit主要基于Core Graphics,但iOS开发通常会结合使用CALayer来管理视图的绘图内容。CGDrawKit可能通过扩展CALayer或使用Core Animation来实现更复杂的动画和交互效果。 8. **触摸事件处理**: 在iOS...