0

我构建了一个演示应用程序来检查图层的锚点、位置和框架之间的关系。

视图的初始外观如下所示:

最初设定

在代码中,我更改了红色视图的锚点,它看起来像这样,我可以理解,因为锚点的更改会影响该视图的框架。

将视图的锚点更改为 (0,0)

为了将视图的框架保持为原始框架,我使用了以下代码:

维护原始框架的代码

我们可以从控制台的打印输出中看到框架已经保持不变。

但是视图的最终外观如下所示,它仍然改变了它的位置,这怎么会发生?

所有代码如下所示:

代码

最后结果

代码如下:

// Reserve original frame
let oldFrame = self.controlledView.frame

// Here I changed the anchorPoint which will cause that view's frame change
self.controlledView.layer.anchorPoint = CGPoint(x: 0, y: 0)

// to avoid the change of frame, set it back
self.controlledView.frame = oldFrame

// From the console's log the frame doesn't change, the red view's final 
// location should be the same with the first image. However it is aligned to the right, 
// which I could not understand.
4

1 回答 1

0

来自Apple 文档上的 CALayer 类参考

您可以使用单位坐标空间指定此属性的值。该属性的默认值为 (0.5, 0.5),表示图层边界矩形的中心。对视图的所有几何操作都围绕指定点进行。例如,对具有默认锚点的图层应用旋转变换会导致图层围绕其中心旋转。将锚点更改为不同的位置会导致图层围绕该新点旋转。

来自Apple 文档上的 UIView 类参考

这个矩形定义了视图在其父视图坐标系中的大小和位置。您在布局操作期间使用此矩形来调整视图的大小和位置。设置此属性会相应地更改由 center 属性指定的点和边界矩形中的大小。框架矩形的坐标始终以点为单位指定

所以从我的角度来看,一旦视图在另一个视图中,当你改变框架时,你改变的是相对于他的超级视图而不是自身的中心和大小。

为了测试我的理论,我做了一个小例子

import UIKit

class ViewController: UIViewController {

    var insideView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Setup Inside view
        self.insideView = UIView()

        var frame: CGRect = CGRectZero

        frame.size.height = 40.0
        frame.size.width = 40.0

        frame.origin.x = self.view.frame.size.width / 2 - 20.0
        frame.origin.y = self.view.frame.size.height / 2 - 20.0

        self.insideView.frame = frame
        self.insideView.backgroundColor = UIColor.redColor()

        self.view.addSubview(self.insideView)

        NSLog("One layer -> InsideView size: %@", NSStringFromCGRect(self.insideView.frame))
        // Output: 2015-05-22 20:13:11.342 test[42680:12030822] One layer -> InsideView size: {{140, 264}, {40, 40}}

        // Setup Another layer

        var insideLayer: CALayer = CALayer()

        insideLayer.backgroundColor = UIColor.blueColor().CGColor

        var insideLayerFrame: CGRect = self.insideView.layer.frame;
        insideLayerFrame.origin.x = 0.0
        insideLayerFrame.origin.y = 0.0

        insideLayer.frame = insideLayerFrame

        insideLayer.anchorPoint = CGPoint(x: 0.0, y: 0.0)

        self.insideView.layer.addSublayer(insideLayer)

        NSLog("Two layers -> InsideView size: %@", NSStringFromCGRect(self.insideView.frame))
        // Output: 2015-05-22 20:13:11.342 test[42680:12030822] Two layers -> InsideView size: {{140, 264}, {40, 40}}
    }
}

所以我将视图层留在它的位置并添加一个我可以操作的新的。

结果是:

在此处输入图像描述

希望这可以帮助:)

于 2015-05-22T19:15:04.557 回答