CALayer

CAGradientLayer 渐变色遮罩
CAGradientLayer.png
  • CAGradientLayer用来绘制渐变色,指定几个颜色值、渐变结束位置,就能在layer中绘制出渐变效果。
// 添加渐变层
CAGradientLayer * shadow = [CAGradientLayer layer];
shadow.frame = imgV.bounds;
shadow.opacity = .4f;
[imgV.layer addSublayer:shadow];
// [imgV.layer insertSublayer:shadow atIndex:0];
// 设置渐变的方向
shadow.startPoint = CGPointMake(0, 0);
shadow.endPoint = CGPointMake(1, 1);
//  设置渐变的颜色
    shadow.colors = @[(__bridge id)[UIColor blueColor].CGColor,
                      (__bridge id)[UIColor redColor].CGColor,
                      (__bridge id)[UIColor greenColor].CGColor];
 // 设置渐变分割点
shadow.locations = @[@(0.15f), @0.5f, @0.85];
CAReplicatorLayer 复制图层
Replicator.png
  • CAReplicatorLayer创建layer和sublayer的多个副本,副本改变颜色、形状、透明度

ReplicatorView.m

#import "ReplicatorView.h"

@implementation ReplicatorView

// 必须重写,否则-[CALayer setInstanceCount:]: unrecognized selector sent to instance
+ (Class)layerClass {
    return [CAReplicatorLayer class];
}
- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.bounds];
        imageView.image = [UIImage imageNamed:@"GMJ"];
        [imageView setContentMode:UIViewContentModeScaleToFill];
        [self addSubview:imageView];
    }
    return self;
}
@end

运用

ReplicatorView *testV = [[ReplicatorView alloc] initWithFrame:CGRectMake(DDYSCREENW/4.0, DDYSCREENW/2.0+64, DDYSCREENW/2.0, DDYSCREENW/2.0)];
 [self.view addSubview:testV];
 
    CAReplicatorLayer *rlayer = (CAReplicatorLayer *)testV.layer;
    rlayer.instanceCount = 2;
    CATransform3D transform = CATransform3DMakeTranslation(0, testV.ddy_h+5, 0);
    transform = CATransform3DRotate(transform, M_PI, 1, 0, 0);
    transform = CATransform3DScale(transform, 1, 0.8, 1);
    rlayer.instanceTransform = transform;
    rlayer.instanceAlphaOffset = -0.1;
    rlayer.instanceRedOffset = -0.1;
    rlayer.instanceGreenOffset = -0.1;
    rlayer.instanceBlueOffset = -0.1;
CAEmitterLayer 粒子发生器
Emitter.png
  • CAEmitterLayer用来实现基于Core Animation的粒子发生器系统,每个粒子都是一个CAEmitterCell的实例,粒子绘制在背景色与border之上。在属性中,可以指定Layer中的CAEmitterCell数组,每个cell定义了自己的一组属性,如速度、粒子发生率、旋转、缩放或者内容等。每个粒子也都有一个emitterCells属性,可以做为一个粒子发生器来运作。Layer还可以设置发生器位置、发生器形状、发射单元的位置等等。

  • emitterMode 发送的样式:

    • kCAEmitterLayerPoints //点(默认)
    • kCAEmitterLayerOutline//线
    • kCAEmitterLayerSurfack//面
    • kCAEmitterLayerVolume//团
  • renderMode 粒子渲染方式:

    • kCAEmitterLayerOldestFirst 最后的出生的粒子 在第一个
    • kCAEmitterLayerOldestLast 最后的出生的粒子 在最后面
    • kCAEmitterLayerBackToFront 把后面的 放到上面
    • kCAEmitterLayerAdditive 叠加
  • emitterShape 发送形状的样式:

    • kCAEmitterLayerPoint 点
    • kCAEmitterLayerLine 线
    • kCAEmitterLayerRectangle 矩形
    • kCAEmitterLayerCuboid 立方体
    • kCAEmitterLayerCircle 曲线
    • kCAEmitterLayerSphere 圆形
    CAEmitterLayer *emitter = [CAEmitterLayer layer];
    emitter.frame = CGRectMake(0, 0, DDYSCREENW, DDYSCREENH);
    [self.view.layer addSublayer:emitter];
    emitter.emitterPosition = CGPointMake(DDYSCREENW/2.0, DDYSCREENH*5/6.0);
    // emitterMode 发送的样式,默认是点
    emitter.emitterMode = kCAEmitterLayerPoints;
    // renderMode 粒子渲染方式: 叠加增强
    emitter.renderMode = kCAEmitterLayerAdditive;
    // 每秒产生4个
    emitter.birthRate = 4;
    
    CAEmitterCell *rocket = [CAEmitterCell emitterCell];
    rocket.contents = (__bridge id)[UIImage imageWithColor:DDYRandomColor size:CGSizeMake(5, 5)].CGImage;
    // 经纬度,经度角:x-y轴平面上与x轴夹角,纬度角:x-z轴平面上与x轴夹角
    rocket.emissionLongitude = -M_PI / 2;
    rocket.emissionLatitude = 0;
    // 粒子存活时间:5秒后消失
    rocket.lifetime = 5.0;
    // birthRate:100/s,与CAEmitterLayer的birtuRate相乘,最终400/s
    rocket.birthRate = 100;
    // velcity指定了初速度
    rocket.velocity = 400;
    // velcityRange设置初速度在300到500之间浮动
    rocket.velocityRange = 100;
    // yAcceleration指定了沿y轴250的加速度,用于给粒子减速
    rocket.yAcceleration = 250;
    // emissionRange 围绕着y轴负方向,建立了一个圆锥形,粒子范围内打出
    rocket.emissionRange = M_PI / 4;
    // color设置了粒子的颜色,并设置了每个色值的浮动范围,用于生成所有颜色的烟火
    rocket.color = CGColorCreateCopy(DDYColor(255.0, 120.0, 120.0, 0.5).CGColor);
    rocket.redRange = 0.5;
    rocket.greenRange = 0.5;
    rocket.blueRange = 0.5;
    rocket.alphaSpeed = -0.2;
    // 设置了名称,以后可以再次引用它
    [rocket setName:@"rocket"];
    emitter.emitterCells = @[rocket];


/*
// 设置基本动画
        CABasicAnimation *ani =  [CABasicAnimation animationWithKeyPath:@"emitterCells.snow.birthRate"];
        ani.fromValue = @(20.0);
        ani.toValue   = @(0.0);
        ani.duration  = 12.f;
        // 设置结束时的值
        [snowEmitter setValue:[NSNumber numberWithFloat:0]  forKeyPath:@"emitterCells.snow.birthRate"];
        // 添加动画
        [snowEmitter addAnimation:ani forKey:nil];
*/
CAScrollLayer
  • CAScrollLayer提供了和UIScrollView的基本功能。只不过它是layer,只负责显示,不响应用户事件,也不提供滚动条
CATiledLayer
  • CATiledLayer提供异步加载图片各部分的功能。layer的drawLayer:inContext:方法会在出现时回调,用来绘制对应部分的内容。可以通过Context的clip bounds和CTM(当前图形上下文的仿射变换,CGContextGetCTM方法)来判断是图片的哪一部分以及大小
CATransformLayer
  • CATransformLayer用来创建3D的layer结构,而不是CALayer那样的扁平结构。和普通layer不同的地方有:

1、transform layer只渲染sublayers,那些从CALayer继承下来的属性不起作用,包括:backgroundColor, contents, border style properties, stroke style properties等。

2、2D图片的处理属性也不起作用,包括:filters, backgroundFilters, compositingFilter, mask, masksToBounds以及阴影属性。

3、opacity属性会应用到每个sublayer,transform layer并不作为一个整体来实现半透明效果。

4、在transform layer上不可以调用hitTest:方法,因为它并不存在一个2D的坐标空间来定位所测试的点。

在transform layer上设置sublayerTransform的m34值,定位一个透视点,sublayer上应用z轴位置变换的动画,就可以看到3D效果。

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

推荐阅读更多精彩内容