1

如何獲取UIView的寬度和高度,其大小和位置是使用自動佈局和Apple的視覺格式語言設置的?使用Auto Layout和NSLayoutConstraints以編程方式檢索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的寬度和高度,我需要進一步定位這些子視圖。

任何想法?

+1

嘗試添加'layoutIfNeeded'您的約束不會立即應用 – 2015-02-05 18:54:02

+0

你說的沒錯,這個工作@阿龍的回答有更多的信息,但我覺得有些人可能會喜歡這個簡單。回答。隨意添加您的評論作爲答案,我會投兩個答案,因爲他們都對我有用。 – TenaciousJay 2015-02-06 22:23:11

回答

4

您有幾種選擇:通過調用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)") 
} 
+0

良好的洞察力。在我的情況下,我需要在所有子視圖佈局之前知道stageView的大小,因爲某些子視圖的大小和位置基於stageView的大小。謝謝您的幫助。 – TenaciousJay 2015-02-06 22:26:14

+0

@TenaciousJay你可能只是表達這些作爲你的子視圖和他們的超級視圖之間的約束。那麼當佈局發生時你不必擔心。 – 2015-02-06 22:30:01

+0

@AaronBrager使用'setNeedsLayout'和'layoutIfNeeded',我可以指定寬度,以便視圖將垂直擴展,保持固定的寬度? – Nil 2017-10-24 13:16:19

2

您需要檢查viewDidLayoutSubviews中的幀。 此功能約束計算後運行 它猜想是這個樣子

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

} 
+0

感謝您的答案,但這並不適用於我的情況,因爲在子視圖的其餘部分佈局之前,我需要知道stageView的大小。 – TenaciousJay 2015-02-06 22:27:37

+0

其他答案有幫助嗎?或者你需要我嘗試思考不同的解決方案? – Blacky 2015-02-07 13:05:11

相關問題