Calayer简单应用——下载进度条

时间:2022-02-17 19:37:15

封装一个UIView内含有一个CAlayer属性(隐式动画,无法修改duration等参数


在iOS中CALayer的设计主要是了为了内容展示和动画操作,CALayer本身并不包含在UIKit中,它不能响应事件。由于CALayer在设计之初就考虑它的动画操作功能,CALayer很多属性在修改时都能形成动画效果,这种属性称为“隐式动画属性”。但是对于UIView的根图层而言属性的修改并不形成动画效果,因为很多情况下根图层更多的充当容器的做用,如果它的属性变动形成动画效果会直接影响子图层。另外,UIView的根图层创建工作完全由iOS负责完成,无法重新创建,但是可以往根图层中添加子图层或移除子图层。

注:要想做隐性动画就在该类中直接创建一个CALayer属性加到self.view.layer的子layer上,通过修改这个子layer的值达到隐性动画的效果.


#import <UIKit/UIKit.h>


@interface ProgressView : UIView

@property (nonatomic,assign)float progress;

@end




****************************************************************************************************************************************************************


#import "ProgressView.h"


@interface ProgressView()

@property (nonatomic,strong)CALayer *progressLayer;

@end

@implementation ProgressView


- (instancetype)initWithFrame:(CGRect)frame{

    

    if (self = [superinitWithFrame:frame]) {

        

        self.progressLayer = [CALayerlayer];

        self.progressLayer.frame =CGRectMake(0,0,0, frame.size.height);

        self.progressLayer.backgroundColor = [UIColorcyanColor].CGColor;

        [self.layeraddSublayer:self.progressLayer];

    }

    

    returnself;

}

重写get方法,外部调用时通过修改这个属性就能达到进度条值改变的效果

- (void)setProgress:(float)progress{

    

    _progress = progress;

    if (progress <=0) {

        

        progress = 0;

    }elseif (progress >=1){

        

        progress = 1.0f;

    }

    

    self.progressLayer.frame =CGRectMake(0,0,self.frame.size.width *progress,3);

}

@end