美文网首页ios动画
使用CALayer中的mask属性绘图和动画

使用CALayer中的mask属性绘图和动画

作者: Maggie的小蜗居 | 来源:发表于2016-11-30 09:26 被阅读165次

1. CALaye主要是了为了内容展示和动画操作,但CALayer无法响应事件

  • mask:图层蒙版,决定了父图层的部分可见区域

    @property(strong) CALayer *mask

    mask图层的范围为父图层的可见区域

  • 使用mask属性练习绘制圆后整个圆旋转

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.perAngle = M_PI/60;
        self.centerPoint = CGPointMake(150, 150);
        self.cirleLayer = [CAShapeLayer layer];
        self.cirleLayer.frame = CGRectMake(50, 50, 300, 300);
        self.cirleLayer.fillColor = [UIColor redColor].CGColor;
        self.cirleLayer.strokeColor = [UIColor whiteColor].CGColor;

        self.path = [[UIBezierPath alloc] init];
        [self calculatePoints:self.path];
        self.cirleLayer.path = self.path.CGPath;

        //绘制mask图层,为cirleLayer要显示的区域
        self.mask = [CAShapeLayer layer];
        self.mask.fillColor = nil; //nil代表画圆环,设置了color就是画圆
        self.mask.lineWidth = 10;
        self.mask.strokeColor = [UIColor blackColor].CGColor;
        self.cirleLayer.mask = self.mask;
        [self.layer addSublayer:self.cirleLayer];
        self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateCurrent) userInfo:nil repeats:YES];
    }
    return self;
}

//画圆的半径
- (void)calculatePoints:(UIBezierPath *)path {

    CGFloat height = 0;
    CGFloat width = 0;
    CGPoint point;
    for (int i= 1; i <= 120; i++) {
        height = 150 * sin(self.perAngle * i);
        width = 150 * cos(self.perAngle * i);
        point = CGPointMake(self.centerPoint.x - width, self.centerPoint.y - height);
        [path moveToPoint:self.centerPoint];
        [path addLineToPoint:point];
    }
}

- (void)updateCurrent
{

    static CGFloat endAngle = 0;
    endAngle += self.perAngle;
    if (endAngle >= M_PI*2) {
        [self.timer invalidate];
        [self startAnimation];
    }else {
        self.maskPath = [UIBezierPath bezierPathWithArcCenter:self.centerPoint radius:150 startAngle:0 endAngle:endAngle clockwise:true];
        self.mask.path = self.maskPath.CGPath;
    }
}

- (void)startAnimation
{
    CABasicAnimation *rotateAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotateAnimation.fromValue = [NSNumber numberWithFloat:0.0];
    rotateAnimation.toValue = [NSNumber numberWithFloat:2 * M_PI];
    rotateAnimation.repeatCount = MAXFLOAT;
    rotateAnimation.duration = 80;
    [self.cirleLayer addAnimation:rotateAnimation forKey:@"rotate"];
}


  • 效果展示(gif展示效果有点奇怪,具体效果可在模拟器上看)
circle.gif

2. 属性动画结束之后的delegate方法里获取做动画的对象

1.
  groupAnnimation.delegate = self;
  [groupAnnimation setValue:groupLayer forKey:@"animationName"];

2.在animationDidStop获取
    - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    //获取到调用动画的layer
    CATextLayer *groupLayer = [anim valueForKey:@"animationName"];
    [groupLayer removeFromSuperlayer];
    //另外一个动画的开始
    [self updateCurrentString];
}

相关文章

  • 使用CALayer中的mask属性绘图和动画

    1. CALaye主要是了为了内容展示和动画操作,但CALayer无法响应事件 mask:图层蒙版,决定了父图层的...

  • CALayer

    初探CALayer属性 IOS中CALayer的使用//这个算是比较全了 iOS - CALayer 绘图层 iO...

  • CALayer之mask使用

    mask是CALayer的一个属性,它本身也是一个CALayer类。mask有和其他图层一样的绘制和布局属性。它类...

  • CALayer的属性和使用(持续更新)

    为了动画和特效,CALayer属性和使用的介绍是必不可少的。 一、CALayer的常用属性 1、@property...

  • SplashAnimation

    涉及到的技术点CALayer的mask属性mask 也是一个 CALayer当我们使用时,就需要单独创建一个 CA...

  • CALayer属性mask

    CALayer的属性mask,mask也是一个layer,这边称它为maskLayer。介绍中描述 An opti...

  • 547,CALayer之mask属性-遮罩(面试点:mask属性

    CALayer有一个属性叫做mask。 这个属性本身就是个CALayer类型,有和其他图层一样的绘制和布局属性。 ...

  • CALayer之mask属性-遮罩

    CALayer有一个属性叫做mask。 这个属性本身就是个CALayer类型,有和其他图层一样的绘制和布局属性。 ...

  • CALayer中的mask属性

    以前我们经常使用layer.cornerRadius为View切圆角 但是有时候你会发现你设置了圆角但是图形并没有...

  • CALayer的mask属性

    CALayer的mask属性俗称蒙版。@property(nullable, strong) CALayer *m...

网友评论

    本文标题:使用CALayer中的mask属性绘图和动画

    本文链接:https://www.haomeiwen.com/subject/gxnzpttx.html