使用Auto Layout和NSLayoutConstraints以编程方式检索UIView的宽度和高度?

时间:2015-02-05 18:51:08

标签: ios swift autolayout nslayoutconstraint visual-format-language

如何使用自动布局和Apple的可视化格式语言设置UIView的大小和位置的宽度和高度?

以下代码(view只是来自UIViewController的变量):

// Create and add the view
var stageView = UIView()
stageView.setTranslatesAutoresizingMaskIntoConstraints(false) // Since I'm using Auto Layout I turn this off
view.addSubview(stageView)

// Create and add constraints to the containing view
let viewsDictionary = ["stageView":stageView]
let horizontalConstraints: NSArray = NSLayoutConstraint.constraintsWithVisualFormat("H:|-150-[stageView]-150-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary)
let verticalConstraints: NSArray = NSLayoutConstraint.constraintsWithVisualFormat("V:|-100-[stageView]-150-|", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: viewsDictionary)
view.addConstraints(horizontalConstraints)
view.addConstraints(verticalConstraints)        
println("stageView.frame=\(stageView.frame)")

得到了:

stageView.frame=(0.0,0.0,0.0,0.0)

所以我试过了:

let fittingSize = stageView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
println("fittingSize=\(fittingSize)")

得到了:

fittingSize=(0.0,0.0)

我似乎无法找到获得规模的方法。我可以使用自动布局和可视化格式语言将子视图添加到stageView,但我无法获得stageView的宽度和高度,我需要进一步定位那些子视图。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您有几个选择:

您可以通过调用setNeedsLayout强制布局引擎立即调整视图大小,然后调用layoutIfNeeded。这是不推荐,因为效率低,布局所需的任何手动框架可能尚未设置。您可以在answer to this question上了解有关此方法的更多信息。

您还可以等到视图控制器中的子视图更新:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    println("stageView.frame = \(stageView.frame)")
}

如果您想知道UIView子类(或更常见的是UITableViewCell子类,您可以在layoutSubviews运行后进行检查:

override func layoutSubviews() {
    super.layoutSubviews()
    println("self.frame = \(self.frame)")
}

答案 1 :(得分:2)

您需要检查viewDidLayoutSubviews中的框架。 此函数在约束计算后运行 它假设看起来像这样

override func viewDidLayoutSubviews()
{
    super.viewDidLayoutSubviews()
    //Print frame here   

}