2015-10-15 80 views
1

我聽說viewDidLayoutSubviews是我們使用約束條件時改變佈局的最佳位置。使用viewDidLayoutSubviews時出現

所以我跳到viewDidLayoutSubviews

我已經創建了三個UIViewsSubViewed他們的SuperView。我沒有提到幀計算的代碼。

[self.view addSubview:imgMiddleCircle]; 
[self.view addSubview:imgFirstCircle]; 
[self.view addSubview:imgLastCircle]; 

使用這片我添加這些圈子。

現在,當我運行的代碼在viewDidLayoutSubviews我得到如下畫面:

enter image description here

當我切換到viewWillLayoutSubviews我得到這個屏幕上:

enter image description here

爲什麼我即使我正在創建三個圈子,我在viewDidLayoutSubviews中增加了兩個圈子。

爲什麼在viewWillLayout給出正確的輸出。

+1

'viewDidLayoutSubviews'被多次調用,這就是爲什麼你看到額外的意見。因此,它不是添加子視圖的最佳位置。通常情況下,你需要在'viewDidLoad'中添加子視圖,如果你確定你想手動計算框架,那麼你只需要'viewDidLayoutSubviews'中的內容' – Alladinian

+0

你的意思是多次調用內部'viewDidLayoutSubviews' ....並且我因爲我打開了自動佈局,所以無法使用'viewDidLoad'。我正根據現有控件進行計算。在viewDidLoad中,我沒有得到現有控件的正確框架 – Dalvik

+1

@RahulMishra在'viewDidLayoutSubviews'中設置框架,並在'viewDidLoad'中添加子視圖。 –

回答

3

您應該爲viewDidLayoutSubviews被稱爲多種類型的事實編碼。

理想情況下addSubview:應該發生在像viewDidLoad這樣的地方,你可以確定它只被調用一次。

您可以創建一個標誌,以避免調用addSubview:倍數類型(不是我個人的選擇)

否則,嘗試做你的計算之前將您設置的代碼viewDidLoad並迫使觀點來表現自己:

[yourView setNeedsLayout];

[yourView layoutIfNeeded];

2

Apple Documentation

當一個視圖控制器的視圖邊界的變化,認爲 調整其子視圖的位置,然後系統調用該方法 。但是,調用此方法並不表示視圖子視圖的各個佈局已被調整。每個 子視圖負責調整其自己的佈局。

您的視圖控制器可以覆蓋此方法,以便在 視圖佈置其子視圖後進行更改。這個 方法的默認實現什麼都不做。

所以,從本質上講,viewDidLayoutSubiews被創造你的viewController包括像旋轉的裝置,滾動等,所以,你應該非常小心,與你加入到這個方法的代碼的情況下在多次調用,因爲它也可能會多次執行。 使用此方法重新定位您的子視圖,而不是添加/刪除它們。

查看此blog瞭解更多詳情。

相關問題