CALayer

一、CALayer
1、CALayer一般作为UIViewiew的容器使用
2、CALayer是一个管理着图片载体的层结构
3、直接修改单独创建出的CALayer的属性可以触发隐式动画
4、UIview中的CALayer动画必须显示触发才能生效

例一、
@property(nonatomic,strong)CALayer * layer;
 - (void)viewDidLoad {
   [super viewDidLoad];
  UIView * containerView=[[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 3)];
  containerView.backgroundColor=[UIColor redColor];
  [self.view addSubview:containerView];

  self.layer=[CALayer layer];
  self.layer.frame=CGRectMake(0, 0, 0, 3);
  self.layer.backgroundColor=[UIColor greenColor].CGColor;
  [containerView.layer addSublayer:self.layer];

  [self performSelector:@selector(layerAnimation) withObject:nil afterDelay:3.0f];
 }

 -(void)layerAnimation
 {
     self.layer.frame=CGRectMake(0, 0, 50, 3);
}

如图做隐式动画的缓冲进度条


例二:
自定义一个view
 ProgressView.h文件
 @interface ProgressView : UIView
 @property(nonatomic,assign)CGFloat progress;//进度参数
 @end
 ProgressView.m文件
 #import "ProgressView.h"
/** 存放不想让外部类访问的变量 */
@interface ProgressView ()
@property(nonatomic,strong)CALayer * progressLayer;
@property(nonatomic,assign)CGFloat currentViewWidth;
@end

@implementation ProgressView

- (instancetype)initWithFrame:(CGRect)frame
  {
     self = [super initWithFrame:frame];
     if (self) {
    self.progressLayer=[CALayer layer];
    self.progressLayer.frame=CGRectMake(0, 0, 0, frame.size.height);
    self.progressLayer.backgroundColor=[UIColor greenColor].CGColor;
    [self.layer addSublayer:self.progressLayer];
    
    //存储当前view的宽度值
    self.currentViewWidth=frame.size.width;
}
    return self;
}
/**  重写setter,getter方法 */
@synthesize progress=_progress;
  -(void)setProgress:(CGFloat)progress
 {
_progress=progress;
if (progress<=0) {
    self.progressLayer.frame=CGRectMake(0, 0, 0, self.frame.size.height);
}else if(progress<=1)
{
    self.progressLayer.frame=CGRectMake(0, 0, progress*self.currentViewWidth, self.frame.size.height);
  }
}
-(CGFloat)progress
{
return _progress;
}
@end
viewcontroller里:
@property(nonatomic,retain)ProgressView * progressview;
@property(nonatomic,retain)NSTimer * timer;
- (void)viewDidLoad {
[super viewDidLoad];

self.progressview=[[ProgressView alloc]initWithFrame:CGRectMake(20, 100, 290, 5)];
self.progressview.layer.borderWidth=1.0f;
[self.view addSubview:self.progressview];

[self performSelector:@selector(layerAnimation) withObject:nil afterDelay:3.0f];
self.timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(layerAnimation) userInfo:nil repeats:YES];
}
-(void)layerAnimation
{
   self.progressview.progress=arc4random()% 100/100.f;

}
二、CALayer做渐变动画

例一、
- (void)viewDidLoad {
[super viewDidLoad];
UIImage * image1=[UIImage imageNamed:@"ic_empty"];
self.imageLayer=[CALayer layer];
self.imageLayer.frame=CGRectMake(0, 100, 100, 100);
[self.view.layer addSublayer:self.imageLayer];

self.imageLayer.contents=(__bridge id)((image1.CGImage));
[self performSelector:@selector(layerAnimation) withObject:nil afterDelay:3.0f];
  }
-(void)layerAnimation
{
UIImage * image2=[UIImage imageNamed:@"ic_error"];
self.imageLayer.contents=(__bridge id )((image2.CGImage));
}

 例二、
 - (void)viewDidLoad {
[super viewDidLoad];
UIImage * image1=[UIImage imageNamed:@"ic_empty"];
self.imageLayer=[CALayer layer];
self.imageLayer.frame=CGRectMake(0, 100, 100, 100);
[self.view.layer addSublayer:self.imageLayer];

self.imageLayer.contents=(__bridge id)((image1.CGImage));
[self performSelector:@selector(layerAnimation) withObject:nil afterDelay:3.0f];
      }
-(void)layerAnimation
{
//图片动画
UIImage * image2=[UIImage imageNamed:@"ic_error"];
CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:@"contents"];
animation.fromValue=self.imageLayer.contents;
animation.toValue=(__bridge id )((image2.CGImage));
animation.duration=3.0f;

//bounds动画
CABasicAnimation * boundsAnimation=[CABasicAnimation animationWithKeyPath:@"bounds"];
boundsAnimation.fromValue=[NSValue valueWithCGRect:self.imageLayer.bounds];
boundsAnimation.toValue=[NSValue valueWithCGRect:CGRectMake(0, 100, 50, 50)];
boundsAnimation.duration=3.0f;

//组合动画
CAAnimationGroup * groupAnimation=[CAAnimationGroup animation];
groupAnimation.animations=@[animation,boundsAnimation];
groupAnimation.duration=3.0f;

//设定layer动画结束之后的值(必须设定,否则会恢复到动画之前的状态)
self.imageLayer.contents=(__bridge id )((image2.CGImage));
self.imageLayer.bounds=CGRectMake(0, 100, 50, 50);

//提交动画
[self.imageLayer addAnimation:groupAnimation forKey:nil];

}
创建遮罩
 self.imageContents=[UIImage imageNamed:@"ic_empty"];
 self.maskContents=[UIImage imageNamed:@"ic_error"];

self.imageLayer=[CALayer layer];
self.imageLayer.frame=CGRectMake(50, 50, 200, 200);
self.imageLayer.contents=(__bridge id)((self.imageContents.CGImage));
[self.view.layer addSublayer:self.imageLayer];

self.maskLayer=[CALayer layer];
self.maskLayer.frame=self.imageLayer.bounds;
//  self.maskLayer.contents=(__bridge id )((self.maskContents.CGImage));
self.maskLayer.backgroundColor=[UIColor blackColor].CGColor;

self.imageLayer.mask=self.maskLayer;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,443评论 6 30
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,083评论 5 13
  • 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你...
    被吹落的风阅读 1,543评论 1 2
  • CALayer - 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本...
    Hevin_Chen阅读 1,133评论 0 10
  • 转载:http://www.cnblogs.com/jingdizhiwa/p/5601240.html 1.ge...
    F麦子阅读 1,528评论 0 1