首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >更改CALayer的anchorPoint会移动视图

更改CALayer的anchorPoint会移动视图
EN

Stack Overflow用户
提问于 2009-12-28 12:49:05
回答 9查看 71.3K关注 0票数 134

我想改变anchorPoint,但保持视图不变。我尝试过NSLog、-ing、self.layer.positionself.center,不管anchorPoint有什么变化,它们都保持不变。然而,我的观点却在移动!

关于如何做到这一点,有什么建议吗?

代码语言:javascript
复制
self.layer.anchorPoint = CGPointMake(0.5, 0.5);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
self.layer.anchorPoint = CGPointMake(1, 1);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);

输出为:

代码语言:javascript
复制
2009-12-27 20:43:24.161 Type[11289:207] center point: 272.500000 242.500000
2009-12-27 20:43:24.162 Type[11289:207] center point: 272.500000 242.500000
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-12-29 05:44:03

核心动画编程指南的Layer Geometry and Transforms部分解释了CALayer的位置和anchorPoint属性之间的关系。基本上,层的位置是根据层的anchorPoint的位置指定的。默认情况下,层的anchorPoint为(0.5,0.5),它位于层的中心。设置层的位置时,将设置层在其上层的坐标系中的中心位置。

因为该位置是相对于图层的anchorPoint的,所以在保持相同位置的同时更改该anchorPoint会移动图层。为了防止这种移动,您需要调整图层的位置以适应新的anchorPoint。我这样做的一种方法是抓取层的边界,将边界的宽度和高度乘以新旧锚点的归一化值,取两个anchorPoints的差值,并将该差值应用于层的位置。

您甚至可以通过将CGPointApplyAffineTransform()与您的‘s视图的CGAffineTransform一起使用来说明旋转。

票数 142
EN

Stack Overflow用户

发布于 2014-03-05 12:18:08

对我来说,当我开始将positionanchorPoint与我对UIView中frame.origin的理解进行比较时,它是最容易理解的。frame.origin = ( 20 , 30 )的UIView表示UIView从其父视图的左侧算起20点,从顶端算起30点。此距离是从UIView的哪个点开始计算的?它是从UIView的左上角开始计算的。

在层中,anchorPoint标记计算此距离的点(以标准化形式,即0到1),例如,layer.position = ( 20,30)表示层anchorPoint从其父层的左侧20点到顶部30点。默认情况下,图层anchorPoint为(0.5,0.5),因此距离计算点正好位于图层的中心。下图将有助于澄清我的观点:

如果您将变换应用于层,anchorPoint也恰好是发生旋转的点。

票数 28
EN

Stack Overflow用户

发布于 2013-08-12 22:35:23

有这样一个简单的解决方案。这是基于肯尼的回答。但不是应用旧框架,而是使用它的原点和新的原点来计算平移,然后将该平移应用到中心。它也可以与旋转视图一起工作!下面是代码,比其他解决方案简单得多:

代码语言:javascript
复制
func setAnchorPoint(anchorPoint: CGPoint, view: UIView) {
   let oldOrigin = view.frame.origin
   view.layer.anchorPoint = anchorPoint
   let newOrigin = view.frame.origin

   let translation = CGPoint(x: newOrigin.x - oldOrigin.x, y: newOrigin.y - oldOrigin.y)

   view.center = CGPoint(x: view.center.x - translation.x, y: view.center.y - translation.y)
}
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1968017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档