综合技术

从 CALayer 的 Position、AnchorPoint 说起

微信扫一扫,分享到朋友圈

从 CALayer 的 Position、AnchorPoint 说起
0

本文 demo 地址

有的东西虽然基础,但是耐不住人老记性差呀,自己写下来好过次次再搜咯,so……

AnchorPoint 和 Position

AnchorPoint

anchorPoint 直译过来就是锚点,layer 以该点为基准进行各种 transform 变换,其值从 (0, 0) 到 (1, 1),默认值为 (0.5, 0.5)。该属性的文档中提到:

'(0, 0)' is the bottom left corner of the bounds rect, '(1, 1)' is the top right corner

这里的说的左下角,是在以屏幕的左上角为原点的坐标系中。而在我们日常生活的坐标系中,原点在屏幕的左下角,那么 (0, 0) 位置则是左上角。

Position

实际表示的是锚点在 superLayer 中的位置。

两者的联系

单独修 anchorPointposition 可以修改掉 layer 的位置,但是并不会对另一个属性造成影响。下面例子中,蓝色视图的 frame.size = (100.0, 100.0) ,有一个 frame.size = (0, 0, 100.0, 100.0) 的黄色子视图。

单独修改 anchorPoint

修改锚点
修改锚点前后的输出

单独修改 position

修改position
修改position前后的输出

从以上的输出可以看出,单独修改这两个属性,发生改变的其实是黄色视图的 frame.origin 。不难得到规律:

frame.origin.x = position.x - anchorPoint.x * bounds.size.width
frame.origin.y = position.y - anchorPoint.y * bounds.size.height 
复制代码

如果想要修改锚点后, origin 位置不发生变化,根据以上公式,则需要相应的修改 position ,或者直接暴力的修改 origin 的值。

CALayer 和 UIView 的位置、大小

其实 view 的 frameboundscenter 都是直接返回了 layer 的 frameboundsposition 属性。

Frame 和 Bounds

不管 frame 还是 bounds ,都需要一个参考坐标系。 frame 参考的是父视图的坐标系,表示在父视图坐标系中的位置和大小; bounds 参考的是自身视图的坐标系,表示在自身视图坐标系中的位置和大小。

Bounds

蓝色视图 A 的 frame.size = (100.0, 100.0) ,有一个 frame.size = (0, 0, 100.0, 100.0) 的黄色子视图 B。在修改 A bounds = (-20, -20, 100.0, 100.0) 的时候,如图:

修改bounds

A 的位置不变,B 的位置往右下偏移。因为 A 的 origin 在其自身坐标系中的位置变为了 (-20, -20),B 的 frame.origin 还是 (0, 0),表示 B 在 A 的坐标系中位置为 (0, 0),那么 B 的左上角就相对于 A 的左上角向右下各偏移了 20。

UIScrollView 的 contentOffset

初识 UIScrollView 的时候,我以为在拖动它时,是通过修改子视图的 frame 来产生位移效果的。其实思考一下就会得到子视图位移距离的规律:

translocation.x = subView.frame.origin.x - superview.bounds.origin.x
translocation.y = subView.frame.origin.y - superview.bounds.origin.y
复制代码

刚好 scrollView 的原理其实是修改了自身的 bounds ,而不是修改子视图的 frame

不巧的是, contentOffsetbounds 的值又是一模一样的,我们可以理解为它只是 bounds 属性的一个壳。本文的 demo 中就用了一个 tableView 滚动时输出两个属性证明了以上的几个说法。

阅读原文...


稀土掘金

基于Spring Boot发送 mail

上一篇

阿里确认开发车载小程序

下一篇

您也可能喜欢

评论已经被关闭。

插入图片
从 CALayer 的 Position、AnchorPoint 说起

长按储存图像,分享给朋友