iOS核心动画(三)

视觉效果

圆角

CALayer有一个叫做conenerRadius的属性控制着图层角的曲率。float类型,默认为0.并且吧masksToBounds设置成为YES的话,图层里面的所有东西都会被截取,呈现出圆角状态。

边框

CALayer中的borderWidth和borderColor,两者共同定义了图层边的绘制样式。这条线沿着图层的bouds绘制,同时也包含图层的角。
borderWidth为float类型,默认为0,
borderColor为CGColorRef类型,默认黑色。

阴影

CALayer中的shadowOpacity属性控制着阴影,float类型,默认为0,
shadowColor控制着阴影的颜色,CGColorRef类型,默认黑色,
shadowOffset控制着阴影的方向和距离,CGSize的值,宽度控制这阴影横向的位移,高度控制着纵向的位移,默认值{0,-3},即阴影相对于Y轴有3个点的向上位移,
shadowRadius控制着阴影的模糊度,float类型,默认为0,
shadowPath控制阴影的形状,CGPathRef类型(一个指向CGPath的指针)


变换

仿射变换

CGAffineTransform是一个可以和二维空间向量(例如CGPoint)做乘法的3*2的矩阵!
1.png

CGAffineTransform中的“防射”的意思是无论变换矩阵用什么值,图层中平行的两条线在变换之后仍然保持平行。
x按照a值得比例缩放,
y按照d值得比例缩放
x按照c值比例拉伸
y按照b值比例拉伸
x跟着tx进行平移
y会跟着ty进行平移

CGAffineTransformMakeRotation(CGFloat angle)
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy) 
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)

UIView可以通过设置transform属性做变换,但实际上它只是封装了内部图层的变换
CALayer同样也有一个transform属性,但它的类型是CATransform3D
将一个图片旋转45度

  UIImage *image = [UIImage imageNamed:@"111"];
  self.layerView.layer.contents = (__bridge id)image.CGImage;
  CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI_4);
  self.layerView.layer.affineTransform = transform;
2.png
混合变换

Core Graphics提供了一系列的函数可以在一个变换的基础上做更深层次的变换,

CGAffineTransformRotate(CGAffineTransform t, CGFloat angle) 
CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy) 
CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty)
Tranform类型

1、平移

  • 根据本身的transform进行平移 CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)
  • 根据本身的transform后另外的transform进行平移
    CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)

2、缩放

  • 修改本身的transform进行缩放CGAffineTransformMakeScale(CGFloat sx,CGFloat sy)
  • 根据本身的transform后者另外的transform进行缩放CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)

3、反向旋转
CGAffineTransformInvert(CGAffineTransform t)
4、合并
将两个transform合并起来CGAffineTransformConcat(CGAffineTransform t1,CGAffineTransform t2)
5、放射矩阵应用

  • 得到新的中心CGPoint CGPointApplyAffineTransform(CGPoint point,CGAffineTransform t)
  • 得到新的size CGSize CGSizeApplyAffineTransform(CGSize size,CGAffineTransform t)
  • 得到新的rect CGRect CGRectApplyAffineTransform(CGRect rect,CGAffineTransform t)
    放射矩阵一个常用的情形就是根据用户的收拾来相应的改变试图的变换。
//缩放50%,旋转30度,X轴移动50像素
UIImage *image = [UIImage imageNamed:@"111"];
self.layerView.layer.contents = (__bridge id)image.CGImage;
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformScale(transform, 0.5, 0.5);//缩放50%
transform = CGAffineTransformRotate(transform, M_PI / 180.0 * 30.0);//旋转30度
transform = CGAffineTransformTranslate(transform, 50, 0);//X轴移动50像素
self.layerView.layer.affineTransform = transform;
3.png
斜切变换

没有提供直接的函数,需要自己定义


CGAffineTransform CGAffineTransformMakeShear(CGFloat x, CGFloat y) {
    CGAffineTransform transform = CGAffineTransformIdentity;
    transform.c = -x;
    transform.b = y;
    return transform;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImage *image = [UIImage imageNamed:@"111"];
    self.layerView.layer.contents = (__bridge id)image.CGImage;
    self.layerView.layer.affineTransform = CGAffineTransformMakeShear(1, 0);
    
}
4.png

3D变换

CATransform3D是一个可以在三维空间内做变换的4*4矩阵


5.png

和CGAffineTransform矩阵类似,Core Animation提供了一系列的方法用来创建和组合CATransform3D类型的矩阵

//angle旋转的弧度,
CATransform3DMakeRotation(CGFloat angle, CGFloat x, CGFloat y, CGFloat z) 
//sx x轴缩放 sy y轴缩放 sz z轴缩放
CATransform3DMakeScale(CGFloat sx, CGFloat sy, CGFloat sz)
//tx x平移, ty y平移 tz z平移 
CATransform3DMakeTranslation(Gloat tx, CGFloat ty, CGFloat tz)

CATransform3D中的M34元素,用来做透视变换效果(-1.0/d)d表示了想象中视角相机和屏幕之间的距离
sublayerTransform属性表示父视图变换,里面的子试图也随之变换。

CAShapeLayer

CAShapeLayer是CALayer的子类,是通过一个矢量图而不是bitmap来绘制的图层子类。具有渲染速度快、高效实用内存、不会被图层边界裁掉、不会出现像素化等优点。

UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(175, 100)];
    
    [path addArcWithCenter:CGPointMake(150, 100) radius:25 startAngle:0 endAngle:2 * M_PI clockwise:YES];
    [path moveToPoint:CGPointMake(150, 125)];
    [path addLineToPoint:CGPointMake(150, 175)];
    [path addLineToPoint:CGPointMake(125, 225)];
    [path moveToPoint:CGPointMake(150, 175)];
    [path addLineToPoint:CGPointMake(175, 225)];
    [path moveToPoint:CGPointMake(100, 150)];
    [path addLineToPoint:CGPointMake(200, 150)];
    
    
    CAShapeLayer *shapLayer = [CAShapeLayer layer];
    shapLayer.strokeColor = [UIColor redColor].CGColor;
    shapLayer.fillColor = [UIColor clearColor].CGColor;
    shapLayer.lineWidth = 5;
    shapLayer.lineJoin = kCALineJoinRound;
    shapLayer.lineCap = kCALineCapRound;
    shapLayer.path = path.CGPath;
    [self.view.layer addSublayer:shapLayer];
6.png
CAShapeLayer属性 内容
CGPathRef path 绘图路径
CGColorRef fillColor 闭合路径填充颜色
NSString *fillRule 填充规则
CGColorRef strokeColor 路径颜色
CGFloat lineWidth 线条宽度
CGFloat miterLimit 最大斜接长度
NSString *lineCap 线端点类型
NSString *lineJoin 线连接类型
CGFloat lineDashPhase 线性模板的起始位置
NSArray<NSNumber *> *lineDashPattern 索引从1开始记,奇数位数值表示实线长度,偶数位数值表示空白长度
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容