[英]iOS Autolayout - Frame size not set in viewDidLayoutSubviews
我正在使用Autolayout在iOS 8的鍵盤上工作,將按鈕放在視圖上。
當我使用約束更改布局時,一切都在屏幕上正確顯示,但是當我想知道視圖的幀大小時,我得不到合適的大小。
例如:我按一個鍵,鍵盤布局會根據我的約束更改並布局所有內容。 然后我想知道屏幕上任何按鈕的大小 - 我在“viewDidLayoutSubviews”中執行此操作並在控制台中獲得該結果:
2014-10-29 12:27:09.088 Keyboard[2193:60674] view did layout subviews
2014-10-29 12:27:09.088 Keyboard[2193:60674] {{inf, inf}, {0, 0}}
按鈕具有正確的大小和正確的位置,但在嘗試獲取其框架時,未設置大小。
當我的代碼在viewDidLayoutSubviews中不起作用時,我必須在哪里放置代碼?
我在stackoverflow和其他網站上發現了很多問題,但沒有一個問題涉及我的問題。
我遇到了一個非常相似的問題(upvoted問題),並發現beeef的答案指向了正確的方向。 鑒於Apple的文檔說不直接調用layoutSubviews(),我改為如下(其中mySubView是self.view的直接子視圖):
override func viewDidLayoutSubviews() {
// self.view's direct subviews are laid out.
// force my subview to layout its subviews:
self.mySubView.setNeedsLayout()
self.mySubView.layoutIfNeeded()
// here we can get the frame of subviews of mySubView
// and do useful things with that...
}
僅供參考,在我的情況下,mySubView是一個UIScrollView,我需要獲取其子視圖的框架,以便我可以在視圖出現之前相應地設置contentOffset。 我不確定viewDidLayoutSubviews()是否是最好的地方,但它確保mySubView已經布局。
是! 我自己解決了這個問題。
我不確定我是否做對了,但這就是我的想法:
我現在的解決方案是在我的所有視圖上手動調用.layoutSubviews() ,其中包含鍵盤的所有按鈕。 之后,我得到了我想要的所有按鈕的大小。
如果我錯了,請糾正我。
在使用DispatchQueue.asyncAfter()時我總覺得有點臟,但在這種情況下,由於viewDidLayoutSubviews在視圖層次結構中的所有AutoLayout調整發生之前被調用,因此感覺有必要。 我更喜歡它強制一個額外的同步布局。
override func viewDidLayoutSubviews() {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) { [weak self] in
// Updated sub-subview frames can be accessed here
// Note - access self weakly here for the unlikely, but possible, case it was deallocated
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.