簡體   English   中英

iOS Autolayout - 未在viewDidLayoutSubviews中設置幀大小

[英]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已經布局。

是! 我自己解決了這個問題。

我不確定我是否做對了,但這就是我的想法:

  • 每次布局更改時都會調用viewDidLayoutSubviews
  • viewDidLayoutSubviews在我的視圖的直接子視圖布局時調用,但該子視圖的子視圖在那時沒有布局,因此您無法獲得它們的大小。

我現在的解決方案是在我的所有視圖上手動調用.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM