使用自动布局和 NSLayoutConstraints 以编程方式检索 UIView 的宽度和高度?
Programmatically retrieve the width and height of a UIView using Auto Layout and NSLayoutConstraints?
如何获得 UIView
使用自动布局和 Apple 的视觉格式语言设置大小和位置的宽度和高度?
这是代码(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
的宽度和高度,我需要进一步定位这些子视图。
有什么想法吗?
您需要检查viewDidLayoutSubviews 中的框架。
这个函数运行经过约束计算
它应该看起来像这样
override func viewDidLayoutSubviews()
{
super.viewDidLayoutSubviews()
//Print frame here
}
您有几个选择:
您可以通过调用 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)")
}
如何获得 UIView
使用自动布局和 Apple 的视觉格式语言设置大小和位置的宽度和高度?
这是代码(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
的宽度和高度,我需要进一步定位这些子视图。
有什么想法吗?
您需要检查viewDidLayoutSubviews 中的框架。 这个函数运行经过约束计算 它应该看起来像这样
override func viewDidLayoutSubviews()
{
super.viewDidLayoutSubviews()
//Print frame here
}
您有几个选择:
您可以通过调用 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)")
}