1

如何UIView使用 Auto Layout 和 Apple 的 Visual Format Language 设置尺寸和位置的宽度和高度?

这是代码(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需要进一步定位这些子视图的宽度和高度。

有任何想法吗?

4

2 回答 2

6

你有几个选择:

setNeedsLayout您可以通过调用然后调用来强制布局引擎立即调整视图大小layoutIfNeeded不建议这样做,因为它效率低下,并且可能尚未设置布局所需的任何手动框架。您可以在我对这个问题的回答中阅读更多关于这种方法的信息。

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

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

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

override func layoutSubviews() {
    super.layoutSubviews()
    println("self.frame = \(self.frame)")
}
于 2015-02-05T19:28:41.403 回答
2

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

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

} 
于 2015-02-05T19:23:32.717 回答