彻底理解CALayer的position与anchorPoint

article/2025/10/22 23:34:06

引言

相信初接触到CALayer的人都会遇到以下几个问题:  
为什么修改anchorPoint会移动layer的位置? 
CALayer的position点是哪一点呢? 
anchorPoint与position有什么关系?

我也迷惑过,找过网上的教程,大部分都是复制粘贴的,有些是翻译的文章但很有问题,看得似懂非懂,还是自己写代码彻底弄懂了,做点笔记吧。

每一个UIView内部都默认关联着一个CALayer, UIView有frame、bounds和center三个属性,CALayer也有类似的属性,分别为frame、bounds、position、anchorPoint。frame和bounds比较好理解,bounds可以视为x坐标和y坐标都为0的frame,那position、anchorPoint是什么呢?先看看两者的原型,可知都是CGPoint点。

@property CGPoint position 
@property CGPoint anchorPoint

anchorPoint

一般都是先介绍position,再介绍anchorPoint。我这里反过来,先来说说anchorPoint。

从一个例子开始入手吧,想象一下,把一张A4白纸用图钉订在书桌上,如果订得不是很紧的话,白纸就可以沿顺时针或逆时针方向围绕图钉旋转,这时候图钉就起着支点的作用。我们要解释的anchorPoint就相当于白纸上的图钉,它主要的作用就是用来作为变换的支点,旋转就是一种变换,类似的还有平移、缩放。

继续扩展,很明显,白纸的旋转形态随图钉的位置不同而不同,图钉订在白纸的正中间与左上角时分别造就了两种旋转形态,这是由图钉(anchorPoint)的位置决定的。如何衡量图钉(anchorPoint)在白纸中的位置呢?在iOS中,anchorPoint点的值是用一种相对bounds的比例值来确定的,在白纸的左上角、右下角,anchorPoint分为为(0,0), (1, 1),也就是说anchorPoint是在单元坐标空间(同时也是左手坐标系)中定义的。类似地,可以得出在白纸的中心点、左下角和右上角的anchorPoint为(0.5,0.5), (0,1), (1,0)。

然后再来看下面两张图,注意图中分iOS与MacOS,因为两者的坐标系不相同,iOS使用左手坐标系,坐标原点在左上角,MacOS使用右手坐标系,原点在左下角,我们看iOS部分即可。  

test  
图1

test  
图2

像UIView有superView与subView的概念一样,CALayer也有superLayer与layer的概念,前面说到的白纸和图中的矩形可以理解为layer,书桌和图中矩形以外的坐标系可以理解成superLayer。如果各自以左上角为原点,则在图中有相对的两个坐标空间。

position

在图1中,anchorPoint有(0.5,0.5)和(0,0)两种情况,分别为矩形的中心点与原点。那么,这两个anchorPoint在superLayer中的实际位置分别为多少呢?简单计算一下就可以得到(100, 100)和(40, 60),把这两个值分别与各自的position值比较,发现完全一致,该不会是巧合?

这时候可以大胆猜测一下,position是不是就是anchorPoint在superLayer中的位置呢?答案是确定的,更确切地说,position是layer中的anchorPoint点在superLayer中的位置坐标。因此可以说, position点是相对suerLayer的,anchorPoint点是相对layer的,两者是相对不同的坐标空间的一个重合点。

再来看看position的原始定义: The layer’s position in its superlayer’s coordinate space。 
中文可以理解成为position是layer相对superLayer坐标空间的位置,很显然,这里的位置是根据anchorPoint来确定的。

图2中是矩形沿不同的anchorPoint点旋转的形态,这就是类似于刚才讲的图钉订在白纸的正中间与左上角时分别造就了两种旋转形态。

anchorPoint、position、frame

anchorPoint的默认值为(0.5,0.5),也就是anchorPoint默认在layer的中心点。默认情况下,使用addSublayer函数添加layer时,如果已知layer的frame值,根据上面的结论,那么position的值便可以用下面的公式计算:

position.x = frame.origin.x + 0.5 * bounds.size.width  

position.y = frame.origin.y + 0.5 * bounds.size.height


里面的0.5是因为anchorPoint取默认值,更通用的公式应该是下面的:

position.x = frame.origin.x + anchorPoint.x * bounds.size.width  

position.y = frame.origin.y + anchorPoint.y * bounds.size.height


下面再来看另外两个问题,如果单方面修改layer的position位置,会对anchorPoint有什么影响呢?修改anchorPoint又如何影响position呢?  
根据代码测试,两者互不影响,受影响的只会是frame.origin,也就是layer坐标原点相对superLayer会有所改变。换句话说,frame.origin由position和anchorPoint共同决定,上面的公式可以变换成下面这样的:

frame.origin.x = position.x - anchorPoint.x * bounds.size.width  

frame.origin.y = position.y - anchorPoint.y * bounds.size.height

这就解释了为什么修改anchorPoint会移动layer,因为position不受影响,只能是frame.origin做相应的改变,因而会移动layer。

理解与运用

在Apple doc对frame的描述中有这么一句话:

Layers have an implicit frame that is a function of the position, bounds, anchorPoint, and transform properties.

可以看到我们推导的公式基本符合这段描述,只不过还缺少了transform,加上transform的话就比较复杂,这里就不展开讲了。


Apple doc中还有一句描述是这样的:

When you specify the frame of a layer, position is set relative to the anchor point. When you specify the position of the layer, bounds is set relative to the anchor point.

大意是:当你设置图层的frame属性的时候,position根据锚点(anchorPoint)的值来确定,而当你设置图层的position属性的时候,bounds会根据锚点(anchorPoint)来确定。

这段翻译的上半句根据前面的公式容易理解,后半句可能就有点令人迷惑了,当修改position时,bounds的width与height会随之修改吗?其实,position是点,bounds是矩形,根据锚点(anchorPoint)来确定的只是它们的位置,而不是内部属性。所以,上面这段英文这么翻译就容易理解了:

当你设置图层的frame属性的时候,position点的位置(也就是position坐标)根据锚点(anchorPoint)的值来确定,而当你设置图层的position属性的时候,bounds的位置(也就是frame的orgin坐标)会根据锚点(anchorPoint)来确定。

在实际情况中,可能还有这样一种需求,我需要修改anchorPoint,但又不想要移动layer也就是不想修改frame.origin,那么根据前面的公式,就需要position做相应地修改。简单地推导,可以得到下面的公式:

positionNew.x = positionOld.x + (anchorPointNew.x - anchorPointOld.x)  * bounds.size.width  

positionNew.y = positionOld.y + (anchorPointNew.y - anchorPointOld.y)  * bounds.size.height

但是在实际使用没必要这么麻烦。修改anchorPoint而不想移动layer,在修改anchorPoint后再重新设置一遍frame就可以达到目的,这时position就会自动进行相应的改变。写成函数就是下面这样的:

- (void) setAnchorPoint:(CGPoint)anchorpoint forView:(UIView *)view{

  CGRect oldFrame = view;

  view.layer.anchorPoint = anchorpoint;

  view.frame = oldFrame;

}

<span style="color: rgb(50, 51, 51); font-family: 'Heiti SC Light'; font-size: 18px; background-color: rgb(255, 255, 255);">总结</span>

1positionlayer中的anchorPointsuperLayer中的位置坐标。 

2、互不影响原则:单独修改positionanchorPoint中任何一个属性都不影响另一个属性。 

3framepositionanchorPoint有以下关系:


frame.origin.x = position.x - anchorPoint.x * bounds.size.width  

frame.origin.y = position.y - anchorPoint.y * bounds.size.height

 

第2条的互不影响原则还可以这样理解:position与anchorPoint是处于不同坐标空间中的重合点,修改重合点在一个坐标空间的位置不影响该重合点在另一个坐标空间中的位置。

原文链接地址:http://www.cnblogs.com/benbenzhu/p/3615516.html


http://chatgpt.dhexx.cn/article/kpASxu9V.shtml

相关文章

position和anchorPoint

本人录制技术视频地址&#xff1a; https://edu.csdn.net/lecturer/1899 欢迎观看。 一、理论概述 1.简单介绍 CALayer有2个非常重要的属性&#xff1a;position和anchorPoint property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) prop…

Ant Design - Anchor

Anchor锚点 此组件的属性有以下几点&#xff1a; 现在给出一份例子 其他属性都很简单就不多说了&#xff0c;主要我遇到的麻烦是 getContainer 属性 锚点是默认body滚动的&#xff0c;所以如果你滚动的区域是body就会看到锚点的小蓝点是会随内容滚动的&#xff0c;但是如果你…

Anchor Point

On default, CCNode’s anchor point is (0, 0), which is at the left-bottom point. CCSprite’s anchor point is (0.5, 0.5), which is at the center. 如果你把一个CCSprite作为child加入到CCNode中&#xff0c;CCNode的anchor point不会对sprite的位置有影响&#xff0c;…

【Cocos2d-x 3.0学习笔记】 AnchorPoint 和Position 关系

先不多说&#xff0c;上两张图片&#xff1a; 解释一下上面图片的意思&#xff1a; 描点就是图片中红点的位置。setAnchorPoint的取值范围0&#xff5e;1&#xff0c;距离设置的是一张图片 setAnchorPoint(Point(0,0))表示在图片左下角, setAnchorPoint(Point(1,1))表示在图片…

iOS开发之layer.frame,layer.anchorPoint,layer.position对frame的影响

最近遇到相关的问题&#xff0c;所以就将这三个属性值&#xff0c;进行了分析和研究&#xff0c;话不多说&#xff0c;直接上代码了&#xff0c;详细的文字描述都在代码中&#xff0c;可以自行查看。 之前还写了一篇文章&#xff0c;也可以同时查看一下&#xff1a; iOS开发之…

anchorPoint

OS开发UI篇—CAlayer层的属性 一、position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性&#xff1a;position和anchorPoint property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) property CGPoint anchorPoint; 称为“定位点”、“…

iOS动画小课堂:定点缩放弹窗(利用锚点anchorPoint进行实现)包含完整demo

文章目录 前言I 基础知识 (CALayer)1.1 anchorPoint1.2 positionII iOS开发中常用的动画(定点缩放弹窗)2.1 核心代码2.2 完整demo源码see also前言 iOS开发中常用的动画(定点缩放弹窗)的应用场景: 会员详情的右侧下拉操作菜单 浏览器的右侧下拉菜单

UIView的bounds、frame、center/position、anchorPoint的关系

视图的frame&#xff0c;bounds和center属性仅仅是存取方法&#xff0c;当操纵视图的frame&#xff0c;实际上是在改变位于视图下方CALayer的frame&#xff0c;不能够独立于图层之外改变视图的frame。 对于视图或者图层来说&#xff0c;frame并不是一个非常清晰的属性&#xff…

彻底理解position与anchorPoint

原文 http://www.cnblogs.com/benbenzhu/p/3615516.html 引言 相信初接触到CALayer的人都会遇到以下几个问题&#xff1a; 为什么修改anchorPoint会移动layer的位置&#xff1f; CALayer的position点是哪一点呢? anchorPoint与position有什么关系&#xff1f; 我也迷惑过&…

彻底弄清 anchorPoint 和 position

最近在研读《iOS Core Animation Advanced Techniques》这一本书&#xff0c;想系统地学习下关于 CALayer、Transition、以及动画等知识点。大家可以在 gitbook 上面找到该书的翻译版本。 传送门 在读到图层几何学这一章的时候&#xff0c;了解到了两个概念&#xff1a;anc…

Cocos2dx学习笔记9:cocos2dx锚点(Anchor Point)

锚点(AnchorPoint)是相对坐标&#xff0c;通常用来定义物体内部的点&#xff0c;在cocos2dx中&#xff0c;一般都是以加载精灵来实现游戏元素的表现&#xff0c;而精灵一般都是对应的一张图片资源。 我们在设置精灵位置的时候&#xff0c;要设置精灵中的锚点来和我们的坐标点相…

Anchorpoints学习笔记:

Anchor Detr学习笔记&#xff1a; 文章目录 Anchor Detr学习笔记&#xff1a;1.首先介绍下什么叫锚点&#xff08;Anchor point&#xff09;2.再来介绍下什么叫DETR3.Anchor Detr 1.首先介绍下什么叫锚点&#xff08;Anchor point&#xff09; ​   Anchor point就类似一张钉…

数学篇(三)向量的基本运算

1.平面向量 1.1平面向量的加法运算 两个向量&#xff0c;&#xff1b; 向量满足四边形法则&#xff1b; 1.2平面向量的乘法运算 两个向量&#xff0c;&#xff1b; 向量乘表示为 ; 相比于向量加运算&#xff0c;向量乘运算要复杂点&#xff0c;很难看明白向量乘的几何意…

2. 数据类型、向量、向量索引、向量修改、向量运算

b站课程视频链接&#xff1a;https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99元&#x1f622;&#x1f622;买了&#xff0c;感觉不错&#xff09;&#xff1a;https://ke.qq.com/course/3707827#term_id103855009 &a…

matlab 向量的基本运算

本文主要参考&#xff1a;王沫然编著的MATLAB与科学计算&#xff08;第2版&#xff09; 博客文章&#xff1a;点击打开链接 1、向量生成 1.1、直接输入 1.2、 xx0:step:xn 1.3、线性等分向量—linespace 1.4、对数等分向量—logspace 2、向量运算 21、加&#xff08;减&#x…

向量复习(一):定义、求解、四则运算、点积和叉积

向量复习&#xff08;一&#xff09; 1. 向量的定义2. 向量的表示3. 向量的求解4. 向量的四则运算4.1 加法4.2 减法4.3 乘法和除法 5. 点积和叉积5.1 点积5.2 叉积 6. 模的求解7. 附录&#xff1a;代码8. 免责声明 首先&#xff0c;我们先来复习一下二维空间几何求交涉及的向量…

向量的基本运算专题

关于向量 高中数学必修 4 4 4说: 几何向量是线性空间中有大小与方向的量。 放图理解一下&#xff1a; 如上图所示&#xff0c;向量可以形象的用一根箭头表示。箭头所指代表向量的方向&#xff0c;线段的长度代表向量的大小。 在 O I OI OI中&#xff0c;我们简化了一下向量的…

向量加减法

常用向量&#xff1a; 2D向量 v < x , y > 3D向量 v < x , y , z > 4D向量 v < x , y , z , w > (也称作齐次坐标) 向量加减法&#xff0c;各维度都是类似的。 向量加法&#xff1a; 向量加法的和就是以两个向量的边作为平行四边形长边的对角线表示 …

两个向量的点乘和叉乘怎么算_数学基础 —— 向量运算:点乘和叉乘

向量的点乘:a * b 公式&#xff1a;a * b |a| * |b| * cosθ 点乘又叫向量的内积、数量积&#xff0c;是一个向量和它在另一个向量上的投影的长度的乘积&#xff1b;是标量。 点乘反映着两个向量的“相似度”&#xff0c;两个向量越“相似”&#xff0c;它们的点乘越大。 向量…

向量的运算

向量 有大小&#xff0c;有方向的量&#xff0c;记为 a ⃗ \vec{a} a 基本运算 向量的加法 首尾相连法则(当然还有其他名字:平行四边形法则、三角形法则) 如图 a ⃗ b ⃗ \vec{a}\vec{b} a b 就相当于将 b ⃗ \vec{b} b 的起点平移到 a ⃗ \vec{a} a 的终点( a ⃗ 、 b ⃗…