Canoe

iOS核心动画实践五(专用图层)

2017.06.21

CAShapeLayer

CAShapeLayer是一个通过矢量图形而不是bitmap来绘制的图层子类。你指定诸如颜色和线宽等属性,用CGPath来定义想要绘制的图形,最后CAShapeLayer就自动渲染出来了。
优点:

  • 渲染快速,使用了硬件加速,同一个图形相对于CoreGraphics快
  • 高效使用内存
  • 不会被图层边界裁剪。可以在边界之外绘制
  • 不会像素化


一般是和贝塞尔曲线一起使用

    UIBezierPath *path = [[UIBezierPath alloc] init];
    
    [path moveToPoint:CGPointMake(175, 100)];
    
    [path addArcWithCenter:CGPointMake(150, 100) radius:25 startAngle:0 endAngle:2* M_PI clockwise:YES];
    [path moveToPoint:CGPointMake(150, 125)];
    [path addLineToPoint:CGPointMake(150, 175)];
    [path addLineToPoint:CGPointMake(125, 225)];
    [path moveToPoint:CGPointMake(150, 175)];
    [path addLineToPoint:CGPointMake(175, 225)];
    [path moveToPoint:CGPointMake(100, 150)];
    [path addLineToPoint:CGPointMake(200, 150)];
    
    CAShapeLayer *shapelayer = [CAShapeLayer layer];
    //线条颜色
    shapelayer.strokeColor = [UIColor redColor].CGColor;
    //填充颜色
    shapelayer.fillColor = [UIColor clearColor].CGColor;
    //线条宽度
    shapelayer.lineWidth = 3;
    //线条之间结合的方式
    shapelayer.lineJoin = kCALineJoinRound;
    //线条末尾的方式
    shapelayer.lineCap = kCALineCapRound;
    shapelayer.path = path.CGPath;
    
    [self.view.layer addSublayer:shapelayer];

//define path parameters
CGRect rect = CGRectMake(50, 50, 100, 100);
CGSize radii = CGSizeMake(20, 20);
UIRectCorner corners = UIRectCornerTopRight | UIRectCornerBottomRight | UIRectCornerBottomLeft;
//create path
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];

切三个圆角一个直角

CATextLayer

CATextLayer基于CoreText,渲染速度非常快。
我们可以使用CATextLayer来绘制Label。
为什么不用label用这个,比如在封装一个大的复杂的控件的时候,使用CAtextLayer可以提升绘制效率。

具体使用谷歌。

CAGradientLayer

渐变图层,主要是使用了硬件加速,所以性能很好。

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
  gradientLayer.frame = self.containerView.bounds;
  [self.containerView.layer addSublayer:gradientLayer];

  //set gradient colors
  gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor, (__bridge id)[UIColor blueColor].CGColor];

  //set gradient start and end points
  gradientLayer.startPoint = CGPointMake(0, 0);
  gradientLayer.endPoint = CGPointMake(1, 1);

CAReplicatorLayer(重复图层)

他的目的是为了高效生成许多相似的图层。并且在每一个复制体上应用不同的变换。只要是很多个相同的图案,位置不一样,或者角度不一样,或者是动画效果都可以使用重复图层来实现。例如雷达动画,加载动画,反射图案等。

    CAReplicatorLayer *layer = [CAReplicatorLayer layer];
    layer.frame = self.view.bounds;
    [self.view.layer addSublayer:layer];
    
    layer.instanceCount = 60;
    
    CATransform3D transform = CATransform3DIdentity;
    transform = CATransform3DRotate(transform, M_PI / 30, 0, 0, 1);
    layer.instanceTransform = transform;
    
    layer.instanceGreenOffset = -0.1;
    layer.instanceBlueOffset = -0.1;
    
    CALayer *subLayer = [CALayer layer];
    subLayer.frame = CGRectMake(375/2.0, 200, 10, 40);
    subLayer.backgroundColor = [UIColor whiteColor].CGColor;
    [layer addSublayer:subLayer];

CAScrollLayer

对应UIScrollVIew。但是UIscrollView并不是使用CAScollLayer来实现的。CAScollLayer的一些拓展方法。

- (void)scrollPoint:(CGPoint)p;
- (void)scrollRectToVisible:(CGRect)r;
@property(readonly) CGRect visibleRect;

CATiledlayer

因为在iOS中,显示高像素的大图会很消耗内存,使用CATiledLayer可以将大图分解成小片按需载入。

CAEmitterLayer

高性能粒子引擎,被用来创建实时粒子动画:烟雾,火雨等这些效果。具体的实现在iOS核心动画高级技巧书中查看。

CAEAGLLayer

在iOS 5中,苹果引入了一个新的框架叫做GLKit,它去掉了一些设置OpenGL的复杂性,提供了一个叫做CLKView的UIView的子类,帮你处理大部分的设置和绘制工作。前提是各种各样的OpenGL绘图缓冲的底层可配置项仍然需要你用CAEAGLLayer完成,它是CALayer的一个子类,用来显示任意的OpenGL图形。

AVPlayerLayer

AVPalyerLayer不是CoreAnimation框架的一部分,由AVFoundation提供用来播放视频的。通常和AVpalyer一同使用。

Comments
Write a Comment