Core Animation笔记(特殊图层)
1.shapeLayer: 渲染快速,内存占用小,不会被图层边界裁掉(可以在边界之外绘制),不会像素化(当做3D变化如缩放是不会失真)
CGRect rect = self.containerView.bounds; CAShapeLayer *shaper = [CAShapeLayer new];
shaper.backgroundColor = [UIColor yellowColor].CGColor;
shaper.lineWidth = ;
shaper.strokeColor = [UIColor redColor].CGColor;
//单独设置左上,右上圆角
UIRectCorner rcorner = UIRectCornerTopLeft|UIRectCornerTopRight; UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:rcorner cornerRadii:CGSizeMake(, )];
//设置路径
shaper.path = path.CGPath;
// [self.containerView.layer addSublayer:shaper]; //定义父图层的可见区域(这里使父图层的圆角单独设置左上,右上)
self.containerView.layer.mask = shaper;
2.CATextLayer
CATextLayer *textLayer = [CATextLayer new];
textLayer.frame = self.containerView.bounds;
[self.containerView.layer addSublayer:textLayer]; //设置文本属性
textLayer.foregroundColor = [UIColor blueColor].CGColor;
textLayer.alignmentMode = kCAAlignmentJustified;
textLayer.wrapped = YES; //设置字体
UIFont *font = [UIFont systemFontOfSize:];
CFStringRef fontStrRef = (__bridge CFStringRef)font.fontName;
CGFontRef fontRef = CGFontCreateWithFontName(fontStrRef);
textLayer.font = fontRef;
CFRelease(fontRef);
textLayer.fontSize = font.pointSize;
//设置缩放倍数,防止像素化
textLayer.contentsScale = [UIScreen mainScreen].scale;
//这里也可以设置富文本字符串NSMutableString
textLayer.string = @"on my god we you yao bei rangyizhuier le ma ,zhe me zhen shi de ma ,ai ";
3.CATransformLayer: 不平面化子图层,用于构建3D 形状,如下代码用于构建一个正方体
//产生某个面的子layer
- (CALayer*)faceWithTransform:(CATransform3D)transform{
CALayer *layer = [CALayer layer]; layer.frame = CGRectMake(-, -, , ); layer.backgroundColor = [UIColor colorWithRed:rand()/(double)INT_MAX green:rand()/(double)INT_MAX blue:rand()/(double)INT_MAX alpha:].CGColor;
layer.transform = transform; return layer;
}
- (CALayer*)cubeWithTransform:(CATransform3D)transform{
CATransformLayer *cubeLayer = [CATransformLayer layer];
//
CATransform3D ct = CATransform3DMakeTranslation(, , );
[cubeLayer addSublayer:[self faceWithTransform:ct]]; //
ct = CATransform3DMakeTranslation(, , );
ct = CATransform3DRotate(ct, M_PI_2, , , );
[cubeLayer addSublayer:[self faceWithTransform:ct]]; //
ct = CATransform3DMakeTranslation(, -, );
ct = CATransform3DRotate(ct, -M_PI_2, , , );
[cubeLayer addSublayer:[self faceWithTransform:ct]];
//
ct = CATransform3DMakeTranslation(, , );
ct = CATransform3DRotate(ct, -M_PI_2, , , );
[cubeLayer addSublayer:[self faceWithTransform:ct]];
//
ct = CATransform3DMakeTranslation(-, , );
ct = CATransform3DRotate(ct, -M_PI_2, , , );
[cubeLayer addSublayer:[self faceWithTransform:ct]];
//
ct = CATransform3DMakeTranslation(, , -);
ct = CATransform3DRotate(ct, M_PI, , , );
[cubeLayer addSublayer:[self faceWithTransform:ct]];
cubeLayer.position = CGPointMake(self.containerView.bounds.size.width/, self.containerView.bounds.size.height/); //运用3D变换
cubeLayer.transform = transform; return cubeLayer; }
- (void)testTransformLayer{
CATransform3D tran = CATransform3DIdentity;
tran.m34 = -1.0/;
//添加透视效果
self.containerView.layer.sublayerTransform = tran; CATransform3D ct2 = CATransform3DIdentity;
ct2 = CATransform3DTranslate(ct2, , , );
ct2 = CATransform3DRotate(ct2, -M_PI_4, , , );
ct2 = CATransform3DRotate(ct2, -M_PI_4, , , ); [self.containerView.layer addSublayer:[self cubeWithTransform:ct2]]; }
4.CAGradientLayer:渐变图层
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = self.containerView.bounds;
[self.containerView.layer addSublayer:gradientLayer]; gradientLayer.colors = @[(__bridge id)[UIColor redColor].CGColor,(__bridge id)[UIColor yellowColor].CGColor,(__bridge id)[UIColor greenColor].CGColor];
gradientLayer.startPoint = CGPointMake(, );
gradientLayer.endPoint = CGPointMake(, );
//各个渐变点开始渐变的位置,和colors数组个数必须一致.
gradientLayer.locations = @[@0.0,@0.1,@0.2]
5.CAReplicatorLayer,生成重复的子图层,并未每个图层应用变换
CAReplicatorLayer *replayer = [CAReplicatorLayer layer];
replayer.frame = self.containerView.bounds;
[self.containerView.layer addSublayer:replayer];
//复制个数
replayer.instanceCount = ; CATransform3D transform = CATransform3DIdentity;
transform = CATransform3DTranslate(transform, , , );
transform = CATransform3DRotate(transform, M_PI/5.0, , , );
transform = CATransform3DTranslate(transform, , -, );
//运用变换
replayer.instanceTransform = transform; //改变下一图层的蓝红通道 ,每个复制的图层颜色不一样
replayer.instanceBlueOffset = -0.1;
replayer.instanceRedOffset = - 0.1; //放一个子图层进去
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(, , , );
layer.backgroundColor = [UIColor whiteColor].CGColor;
[replayer addSublayer:layer];
产生一个倒影效果(这里自定义一个view用于产生倒影效果):
自定义view,返回指定的图层
+ (Class)layerClass{
return [CAReplicatorLayer class];
}
- (instancetype)init{
if (self = [super init]) {
[self setUp];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
[self setUp]; }
return self;
}
- (void)awakeFromNib{
[super awakeFromNib];
[self setUp];
}
- (void)setUp{
CAReplicatorLayer *layer = (CAReplicatorLayer*)self.layer;
layer.instanceCount = ; CATransform3D transform = CATransform3DIdentity; CGSize size = self.bounds.size;
transform = CATransform3DTranslate(transform, 0, size.height+2, 0); /**
y方向倒转
*/
transform = CATransform3DScale(transform, , -, );
layer.instanceTransform = transform;
layer.instanceAlphaOffset = -0.6; }
6.CAEmitterLayer:粒子发散效果
CAEmitterLayer *emmitLayer = [CAEmitterLayer layer];
emmitLayer.frame = self.containerView.bounds;
[self.containerView.layer addSublayer:emmitLayer];
CGSize size = self.containerView.frame.size; emmitLayer.masksToBounds = true;
//重叠部分效果,kCAEmitterLayerAdditive,重叠部分更亮
emmitLayer.renderMode = kCAEmitterLayerAdditive;
//发散点
emmitLayer.emitterPosition = CGPointMake(size.width/, size.height/); CAEmitterCell *cell =[ CAEmitterCell emitterCell];
//注意图片大小
cell.contents = (__bridge id)[UIImage imageNamed:@"spark.jpg"].CGImage;
cell.birthRate = ;//每秒多少个
cell.lifetime = ; cell.color = [UIColor colorWithRed: green:0.5 blue: alpha:].CGColor;
cell.alphaSpeed = -0.3;
cell.velocity = ;
cell.velocityRange = ;
//发散范围
cell.emissionRange = M_PI*; emmitLayer.emitterCells = @[cell];
7.其他
CAEAGLLayer
CAScrollLayer
CATiledLayer:载入大图
Core Animation笔记(特殊图层)的更多相关文章
- Core Animation笔记(动画)
一.隐式动画 layer默认开启隐式动画 禁用隐式动画 [CATransaction setDisableActions:true]; 设置隐士动画时间 //默认0.25s [CATransactio ...
- Core Animation笔记(变换)
1.仿射变换 CGAffineTransformMakeScale : CGAffineTransformMakeTranslation CGAffineTransformMakeRotation(C ...
- Core Animation笔记(- Layer 基本属性)
一.Layer的基本属性 1. contents 图层内容默认为nil 可以指定一张图片作为内容展示 self.layerView.layer.contents = (__bridge id)imag ...
- IOS Core Animation Advanced Techniques的学习笔记(一)
转载. Book Description Publication Date: August 12, 2013 Core Animation is the technology underlying A ...
- IOS Core Animation Advanced Techniques的学习笔记(五)
第六章:Specialized Layers 类别 用途 CAEmitterLayer 用于实现基于Core Animation粒子发射系统.发射器层对象控制粒子的生成和起源 CAGradient ...
- IOS Core Animation Advanced Techniques的学习笔记(四)
第五章:Transforms Affine Transforms CGAffineTransform是二维的 Creating a CGAffineTransform 主要有三种变 ...
- Core Animation学习总结
文件夹: The Layer Beneath The Layer Tree(图层树) The Backing Image(寄宿层) Layer Geometry(图层几何学) Visual Effec ...
- iOS 图形图像动画 Core Animation
//Core Animation #define WeakSelf __weak __typeof(self) weakSelf = self #define StrongSelf __strong ...
- iOS开发之Core Animation
在IOS中如果使用普通的动画则可以使用UIKit提供的动画方式来实现,如果想实现更复杂的效果,则需要使用Core Animation了. 在Core Animation中我们经常使用的是 CABasi ...
随机推荐
- SQLServer newID()
一直想找个除了newid() 外高效取随机数的方法, 有点遗憾,木有找到,谁有除了newid()以外更高效的 请留言,谢谢 从A表随机取2条记录,用SELECT TOP 10 * FROM ywle ...
- C# redis客户端帮助类
需要在NuGet里面引用ServiceStack.Redis using ServiceStack.Redis; using ServiceStack.Redis.Generic; using Sys ...
- mysql全文索引:fulltext
fulltext全文索引 要使用全文索引,不仅需要把某个字段的索引类型设置为fulltext,还需要修改mysql配置文件: [mysqld] ft_wordlist_charset #表示词典的字符 ...
- k8s-RC副本机制
一.libeness probe的三种检测机制 HTTP GET:对容器的IP(指定的端口和路径)执行HTTP GET请求,收到响应并返回状态码不代表错误(2xx/3xx),成功 TCP socket ...
- win10锁住鼠标和键盘操作。
以前做的一个winform自动更新程序没考虑到程序在更新过程中禁止操作被更新程序.现在加上了更新过程中锁住鼠标和大部分键盘. 碰到问题:用系统api -- BlockInput(true)锁住屏幕无效 ...
- Xcode使用 Organizer 分析 Crash logs
xcode下载地址 https://developer.apple.com/download/more/
- kafka示例
1. 引入依赖 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-c ...
- PMBOK(第六版) PMP备考知识总汇!
记录本人学习PMBOK第六版的学习笔记. 备考知识总汇! PMBOK序章 PMP备考指南之相关事项介绍 PMP备考指南之第一章:引论 PMP备考指南之第二章:项目运作环境 PMP备考指南之第三章:项目 ...
- HDFS面试题
hadoop节点动态上线下线怎么操作? )节点上线操作: 当要新上线数据节点的时候,需要把数据节点的名字追加在 dfs.hosts 文件中 ()关闭新增节点的防火墙 ()在 NameNode 节点的 ...
- 【C++札记】赋值兼容
赋值兼容的规则时在需要使用基类对象的任何地方都可以使用公有派生类对象来替代.公有继承派生类可获得基类中除构造函数,析构函数外的所有成员,能用基类解决的问题,派生类也能解决.更直白点说,如果一个类是从一 ...