封装一个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