iOS围绕某点缩放或旋转的AnchorPoint的设定

article/2025/10/22 23:36:04


经常会遇到需求,要求手势的缩放或者旋转操作,要求动作变化围绕某一个特定点,或者是两指的中心点,或者是某一个点。
这个问题首先要清晰的知道,iOS各个view的层次关系。特别是,要清除的知道,当前view的frame与superView的bounds是一个坐标系。

具体来讲,AnchorPoint 是iOS CoreAnimation层的事物。图层的anchorPoint属性是一个CGPoint值,它指定了一个基于图层bounds的符合位置坐标系的位置。Anchor point指定了bounds相对于position的值,更重要的是,它是变换的支点。AnchorPoint值的范围是0 – 1 ,可以理解为AnchorPoint表示了支点位置的坐标占bounds的比例。

iOS CoreAnimation 坐标系原点位于左上角,因此,我们可以很容易的知道,如果想要一个图层的支点位于图层左上角,那么它的AnchorPoint应该是(0, 0)。相应的如果想要支点位于左下角,AnchorPoint应该是 (0, 1)。而默认的中心点的AnchorPoint是(0.5, 0.5)。下图更容易理解。

Snip20140108_2

 

一、如何设置AnchorPoint?

事实上,如果更改了一个图层的AnchorPoint,那么这个图层会发送位移。原因不表,看看文档便知。问题是发生位移之后,我们怎么将位移修复回来。下面是写的方法。

- (void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view
{CGPoint oldOrigin = view.frame.origin;view.layer.anchorPoint = anchorPoint;CGPoint newOrigin = view.frame.origin;CGPoint transition;transition.x = newOrigin.x - oldOrigin.x;transition.y = newOrigin.y - oldOrigin.y;view.center = CGPointMake (view.center.x - transition.x, view.center.y - transition.y);
}

当然你也可以把他写进UIView 的 categary。调用就更方便了。

在进行完围绕AnchorPoint的变换之后,一定要切记将AnchorPoint改回默认。否则有些不需要特殊AnchorPoint的操作,比如拖动,就会变得乱七八糟了。

- (void)setDefaultAnchorPoint forView:(UIView *)view
{[self setAnchorPoint:CGPointMake(0.5f, 0.5f) forView:view];
}

OK,以上是我们在知道了AnchorPoint之后,怎么进行AnchorPoint的设置和回归。那么怎么得到我们真正想要的AnchorPoint的值呢?

二、如何获得AnchorPoint?

如果是两指的缩放或者旋转,有以下方法供参考:

/***  Correct  UIGestureRecognizer 's view 's anchor point , make the view scale or rotate correctly.*/
- (void)correctAnchorPointBaseOnGestureRecognizer:(UIGestureRecognizer *)gr
{CGPoint onoPoint = [gr locationOfTouch:0 inView:gr.view];CGPoint twoPoint = [gr locationOfTouch:1 inView:gr.view];CGPoint anchorPoint;anchorPoint.x = (onoPoint.x + twoPoint.x) / 2 / gr.view.bounds.size.width;anchorPoint.y = (onoPoint.y + twoPoint.y) / 2 / gr.view.bounds.size.height;[self setAnchorPoint:anchorPoint forView:gr.view];
}

记得在UIGestureRecongizer 里,当state == UIGestureRecognizerStateBegan 时,进行调用。然后在手势结束或者失败的时候,(Gr.state == UIGestureRecognizerStateEnded || Gr.state == UIGestureRecognizerStateFailed || pinchGr.state == UIGestureRecognizerStateCancelled) ,将Anchor Point回归默认。

如果是比如我需求里所需,要求90度旋转的时候,围绕画布中心而不是视图中心旋转。有如下方法参考

- (void)correctAnchorPointForView:(UIView *)view
{CGPoint anchorPoint = CGPointZero;CGPoint superviewCenter = view.superview.center;
//   superviewCenter是view的superview 的 center 在view.superview.superview中的坐标。CGPoint viewPoint = [view convertPoint:superviewCenter fromView:view.superview.superview];
//   转换坐标,得到superviewCenter 在 view中的坐标anchorPoint.x = (viewPoint.x) / view.bounds.size.width;anchorPoint.y = (viewPoint.y) / view.bounds.size.height;[self setAnchorPoint:anchorPoint forView:view];
}

同样记得,变换完毕后,重置 AnchorPoint到默认。


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

相关文章

彻底理解CALayer的position与anchorPoint

引言 相信初接触到CALayer的人都会遇到以下几个问题: 为什么修改anchorPoint会移动layer的位置? CALayer的position点是哪一点呢? anchorPoint与position有什么关系? 我也迷惑过,找过网上的教程,大部分都是复制粘…

position和anchorPoint

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

Ant Design - Anchor

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

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中,CCNode的anchor point不会对sprite的位置有影响,…

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

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

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

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

anchorPoint

OS开发UI篇—CAlayer层的属性 一、position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性: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,bounds和center属性仅仅是存取方法,当操纵视图的frame,实际上是在改变位于视图下方CALayer的frame,不能够独立于图层之外改变视图的frame。 对于视图或者图层来说,frame并不是一个非常清晰的属性&#xff…

彻底理解position与anchorPoint

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

彻底弄清 anchorPoint 和 position

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

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

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

Anchorpoints学习笔记:

Anchor Detr学习笔记: 文章目录 Anchor Detr学习笔记:1.首先介绍下什么叫锚点(Anchor point)2.再来介绍下什么叫DETR3.Anchor Detr 1.首先介绍下什么叫锚点(Anchor point) ​   Anchor point就类似一张钉…

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

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

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

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

matlab 向量的基本运算

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

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

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

向量的基本运算专题

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

向量加减法

常用向量&#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;它们的点乘越大。 向量…