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

Ios 使用Auto Layout和NSLayoutConstraints以编程方式检索UIView的宽度和高度?,ios,swift,autolayout,nslayoutconstraint,visual-format-language,Ios,Swift,Autolayout,Nslayoutconstraint,Visual Format Language,如何获得使用自动布局和苹果视觉格式语言设置大小和位置的UIView的宽度和高度 以下代码视图只是UIViewController中的变量: override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() println("stageView.frame = \(stageView.frame)") } 得到: stageView.frame=(0.0,0.0,0.0,0.0) fittingSize=

如何获得使用自动布局和苹果视觉格式语言设置大小和位置的UIView的宽度和高度

以下代码视图只是UIViewController中的变量:

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

stageView.frame=(0.0,0.0,0.0,0.0)
fittingSize=(0.0,0.0)
所以我试着:

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

stageView.frame=(0.0,0.0,0.0,0.0)
fittingSize=(0.0,0.0)
我似乎找不到一个办法来得到这个尺寸。我能够使用自动布局和视觉格式语言将子视图添加到stageView,但我无法获得stageView的宽度和高度,我需要进一步定位这些子视图


有什么想法吗?

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

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

} 

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

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

} 

您有几个选择:

您可以通过调用setNeedsLayout,然后调用LayoutIfNeed,强制布局引擎立即调整视图的大小。不建议这样做,因为这样做效率低下,而且可能还没有设置布局所需的任何手动框架。您可以在我的网站上了解更多有关此方法的信息

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    println("stageView.frame = \(stageView.frame)")
}
如果您想知道UIView子类中的UITableViewCell子类或更常见的UITableViewCell子类,可以在layoutSubviews运行后检查:


您有几个选择:

您可以通过调用setNeedsLayout,然后调用LayoutIfNeed,强制布局引擎立即调整视图的大小。不建议这样做,因为这样做效率低下,而且可能还没有设置布局所需的任何手动框架。您可以在我的网站上了解更多有关此方法的信息

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    println("stageView.frame = \(stageView.frame)")
}
如果您想知道UIView子类中的UITableViewCell子类或更常见的UITableViewCell子类,可以在layoutSubviews运行后检查:


尝试添加所需的布局。你的约束不会立即应用。你是对的,这起作用了@Aaron的答案有更多的信息,但我想有些人可能会喜欢这个答案的简单。请随意添加您的评论作为答案,我将投票支持这两个答案,因为它们对我都很有用。请尝试添加所需的布局。你的约束不会立即应用。你是对的,这起作用了@Aaron的答案有更多的信息,但我想有些人可能会喜欢这个答案的简单。请随意添加您的评论作为答案,我将投票支持这两个答案,因为它们对我都很有用。很好的洞察力。在我的例子中,我需要在布局所有子视图之前知道stageView的大小,因为一些子视图的大小和位置是基于stageView的大小的。感谢您的帮助。您可能只需要将它们表示为子视图和它们的超级视图之间的约束。这样,您就不必担心布局的发生。@Aronbrager使用setNeedsLayout和LayoutIfNeed,我可以指定宽度,以便视图垂直展开,保持固定宽度吗?@nil您可以,但为什么不添加固定宽度约束呢?很好的洞察力。在我的例子中,我需要在布局所有子视图之前知道stageView的大小,因为一些子视图的大小和位置是基于stageView的大小的。感谢您的帮助。您可能只需要将它们表示为子视图和它们的超级视图之间的约束。这样,您就不必担心布局的发生。@Aronbrager使用setNeedsLayout和LayoutIfNeed,我可以指定宽度,以便视图垂直展开,保持固定宽度吗?@nil您可以,但为什么不添加固定宽度约束呢?谢谢您的回答,但这在我的情况下不起作用,因为我需要在布局其他子视图之前知道stageView的大小。其他答案对您有帮助吗?或者您需要我尝试思考不同的解决方案?谢谢您的回答,但这在我的情况下不起作用,因为我需要在布局其余子视图之前知道stageView的大小。其他答案对您有帮助吗?或者你需要我试着想出不同的解决方案?