我构建了一个演示应用程序来检查图层的锚点,位置和框架之间的关系。
视图的初始外观如下所示:
在代码中,我改变了红色视图的锚点,它看起来像这样,我可以理解,因为锚点的改变会影响该视图的框架。
将视图的框架保持为原始框架,我使用了以下代码:
我们可以从控制台的打印输出看到框架已经保持不变。
然而,该观点的最终外观看起来如下,但仍会改变其立场,这怎么可能发生呢?
所有代码都是这样的:
代码如下:
// 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.
答案 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}}
}
}
所以我将视图层放在它的位置并添加一个我可以操作的新视图。
结果是:
希望这有助于:)