用Layer层蒙板实现圆形滚动条效果

先行附上效果图
滚动效果

Mask

Mask又叫蒙板,顾名思义Mask就是layer上的一层layer,于普通的layer层不同的是,Mask Layer是不会显示在界面上的。它的主要功能是通过自身的alpha值来确定被它遮盖的layer层上的点是否显示。如果结果为不显示,那么屏幕上会有什么样的效果呢?难道会直接显示黑点吗?当然不会了,系统会将被遮盖layer的下一层layer点显示出来。这样就间接的形成了被遮盖层透明的效果。

实现方案

  • BlackLayer:该层主要用于显示黑色环状的主体结构,位于整个三层Layer的最下层。
  • RedLayer:该层是被遮盖层,它与BlackLayer层完全重叠,如果没有Mask层的遮盖的话,屏幕上实际显示的就应该是它了。
  • MaskLayer:该层决定了RedLayer的显示区域,这里我们使用Bezier曲线将RedLayer显示出一个特定弧度的角。而圆周上其它弧度则显示的是BlackLayer。
  • 动画:将RedLayer绕自身圆心旋转,这样就能形成进度条的旋转动画了。

实现代码

    CGRect cycleFrame = CGRectMake(50, 50, 100, 100);
    UIBezierPath* cyclePath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 100, 100)];
    
    CAShapeLayer* blackCycleLayer = [CAShapeLayer layer];
    [blackCycleLayer setFrame:cycleFrame];
    [blackCycleLayer setFillColor:[UIColor clearColor].CGColor];
    [blackCycleLayer setLineWidth:1.0f];
    [blackCycleLayer setStrokeColor:[UIColor blackColor].CGColor];
    [blackCycleLayer setPath:cyclePath.CGPath];
    [self.view.layer addSublayer:blackCycleLayer];
    
    CAShapeLayer* redCycleLayer = [CAShapeLayer layer];
    [redCycleLayer setFrame:cycleFrame];
    [redCycleLayer setFillColor:[UIColor clearColor].CGColor];
    [redCycleLayer setLineWidth:1.0f];
    [redCycleLayer setStrokeColor:[UIColor redColor].CGColor];
    [redCycleLayer setPath:cyclePath.CGPath];
    [self.view.layer addSublayer:redCycleLayer];

    CAShapeLayer* maskLayer = [CAShapeLayer layer];
    [maskLayer setFillColor:[UIColor yellowColor].CGColor];
    [maskLayer setLineWidth:1.0f];
    [maskLayer setStrokeColor:[UIColor blueColor].CGColor];
    UIBezierPath* path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(50, 50) radius:50 startAngle:0.0f endAngle:M_PI_4 clockwise:YES];
    [maskLayer setPath:path.CGPath];
    [redCycleLayer setMask:maskLayer];
    
    CABasicAnimation* rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    [rotationAnimation setRepeatCount:HUGE_VALF];
    [rotationAnimation setDuration:2.0f];
    [rotationAnimation setToValue:@(2*M_PI)];
    [redCycleLayer addAnimation:rotationAnimation forKey:nil];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载:http://www.jianshu.com/p/32fcadd12108 每个UIView有一个伙伴称为l...
    F麦子阅读 11,503评论 0 13
  • 每个UIView有一个伙伴称为layer,一个CALayer。UIView实际上并没有把自己画到屏幕上;它绘制本身...
    shenzhenboy阅读 8,316评论 0 17
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,226评论 4 61
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 12,717评论 6 30
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 10,531评论 5 13