将视图框架设置为旧但其位置已更改

时间:2015-05-22 16:55:41

标签: ios frame layer anchorpoint

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

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

initial set up

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

change view's anchor point to (0,0)

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

code to maintain original frame

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

然而,该观点的最终外观看起来如下,但仍会改变其立场,这怎么可能发生呢?

所有代码都是这样的:

code

Final Result

代码如下:

// 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.

1 个答案:

答案 0 :(得分:0)

来自CALayer Class Reference on Apple Documentation

  

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

来自UIView Class Reference on Apple Documentation

  

此矩形在其superview的坐标系中定义视图的大小和位置。在布局操作期间使用此矩形来调整视图的大小和位置。设置此属性会相应地更改center属性指定的点和bounds矩形中的大小。帧矩形的坐标始终以点

指定

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

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

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}}
    }
}

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

结果是:

enter image description here

希望这有助于:)