CALayer - 5
来源:互联网 发布:知乎 北京 裁缝店 编辑:程序博客网 时间:2024/06/05 02:57
前面介绍了一下anchorPoint 和 position , 其实不禁在想,我们通常直接的setFrame不是指定好了位置了吗?
为什么还会有这另外两个的属性呢?
UIView* vview = [UIView new]; [vview setFrame:CGRectMake(0, 0, 200, 100)]; [vview setBackgroundColor:[UIColor greenColor]]; [self.view addSubview:vview]; NSLog(@"vviewLayer's position : %@", NSStringFromCGPoint(vview.layer.position)); NSLog(@"vviewLayer's anchorPoint : %@", NSStringFromCGPoint(vview.layer.anchorPoint));
2016-01-01 21:12:42.585 iosfighterlb3[29184:301237] vviewLayer's position : {100, 50}
2016-01-01 21:12:42.585 iosfighterlb3[29184:301237] vviewLayer's anchorPoint : {0.5, 0.5}
输出如上,可以看到以anchorPoint 为 (0.5, 0.5) 的锚点得出在superLayer上的position是 { 100, 50 } ,这就是 原来尺寸Rect 的一半。
再试着一个,将尺寸改成:
[vview setFrame:CGRectMake(50, 50, 200, 100)];
输出如下:
2016-01-01 21:18:08.531 iosfighterlb3[29499:304774] vviewLayer's position : {150, 100}
2016-01-01 21:18:08.531 iosfighterlb3[29499:304774] vviewLayer's anchorPoint : {0.5, 0.5}
在anchorPoint不变的前提下,输出是 { 150, 100 }
即按照着这样的公式来计算:
150 = 200 * 0.5 + 50 ; <==> X = Layer.width * anchorPoint.x + Layer.origin.x;
100 = 100 * 0.5 + 50 ; <==> Y = Layer.height * anchorPoint.y + Layer.origin.y;
再试着两组不同的数据,在anchorPoint不变的前提下这个是非常好验证的,让我们想是不是就是上面的决定公式呢?
但是如果修改anchorPoint如下,情况就非常有趣了!
UIView* vview = [UIView new]; [vview setFrame:CGRectMake(50, 50, 300, 100)]; [vview setBackgroundColor:[UIColor greenColor]]; vview.layer.anchorPoint = CGPointMake(1, 1); [self.view addSubview:vview]; NSLog(@"vviewLayer's position : %@", NSStringFromCGPoint(vview.layer.position)); NSLog(@"vviewLayer's anchorPoint : %@", NSStringFromCGPoint(vview.layer.anchorPoint));
一看这个数据和效果真是坑爹了,怎么算都算不出这个结果啊!!!
position :
X = Layer.width * anchorPoint.x + Layer.origin.x;
Y = Layer.height * anchorPoint.y + Layer.origin.y;
应该是:300 * 1 + 50 = 350 啊!!! 100 * 1 + 50 = 150 啊!!!
嘻嘻,其实真正理解肯定不是这样惊奇的,让我们来细细解析吧!
首先将修改anchorPoint注释掉,我们得到理所当然的结果:
上面结果非常明确了吧,就是由setFrame来的 origin : { 50, 50 } , 通过公式生成在anchorPoint(中心位置) 的position { 200, 100 }
这个时候如果我们修改了anchorPoint 为 { 0.5, 0.5 } ,来分析图形做了什么事情!
因为修改!所以anchorPoint变化了 { ^0.5, ^0.5 } (这里用^来表示增量), 所以意味着要偏移 { 150, 50 } 个单位!相当好理解吧!就是原来在中心点现在跑去最右角落了,意味着上面这张图要先向上跑50个单位,再向左跑150个单位,看看现在的结果:
原来如此,bounds的size大小并没有改变: { 300, 100 }, 由于anchorPoint的改变使得需要偏移这么多的单位,这里留个伏笔~但是position为 { 200, 100 } ,所以便向左上方移动了 { 150, 50 } 的单位,使得anchorPoint的现在的位置(最右下角)等于position了,结果就是上图了。
我们把Frame输出:
这里的伏笔是为什么position是 { 200, 100 }!!!!在下一个文章会继续讲解!
- CALayer - 5
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- CALayer
- 关于 斜杠 反斜杠 双斜杠 双反斜杠
- Web前端开发实战4:导航菜单(一)
- python中的切片
- VS2012最方便的断点调试
- python初级学习之基于收发邮件的远程控制程序
- CALayer - 5
- 【Android】Activity的生命周期
- Android中常用单位(dpi、px、dp、sp)
- 应用层—域名系统DNS
- iOS开发new与alloc/init的区别
- x265探索与研究(一):x265下载安装与配置
- 命令行方式
- poj1064Cable master【二分】
- 简单Linux C线程池