我想改变anchorPoint
,但保持视图不变。我尝试过NSLog
、-ing、self.layer.position
和self.center
,不管anchorPoint有什么变化,它们都保持不变。然而,我的观点却在移动!
关于如何做到这一点,有什么建议吗?
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);
输出为:
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
发布于 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一起使用来说明旋转。
发布于 2014-03-05 12:18:08
对我来说,当我开始将position
和anchorPoint
与我对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
也恰好是发生旋转的点。
发布于 2013-08-12 22:35:23
有这样一个简单的解决方案。这是基于肯尼的回答。但不是应用旧框架,而是使用它的原点和新的原点来计算平移,然后将该平移应用到中心。它也可以与旋转视图一起工作!下面是代码,比其他解决方案简单得多:
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)
}
https://stackoverflow.com/questions/1968017
复制相似问题