喜有,我已經取消了安裝屬性緊湊高地UIStackView
:設備旋轉後子視圖重新出現後,如何保持UIStackView子視圖的正確佈局?
界面生成器會顯示在縱向模式下的元素並隱藏在橫向模式下的元素。當我在縱向模式下運行在iPhone模擬器應用程序,最初,元件被正確地呈現(按鈕的第二行):旋轉右後
元件消失。但是旋轉又走回到縱向模式後,該元素呈現不正確(見屏幕的左上角):
我需要再次出現後,以編程方式照顧元素的佈局呢?如果是這樣,我在哪裏可以找到文檔來幫助我開始使用它?
喜有,我已經取消了安裝屬性緊湊高地UIStackView
:設備旋轉後子視圖重新出現後,如何保持UIStackView子視圖的正確佈局?
界面生成器會顯示在縱向模式下的元素並隱藏在橫向模式下的元素。當我在縱向模式下運行在iPhone模擬器應用程序,最初,元件被正確地呈現(按鈕的第二行):旋轉右後
元件消失。但是旋轉又走回到縱向模式後,該元素呈現不正確(見屏幕的左上角):
我需要再次出現後,以編程方式照顧元素的佈局呢?如果是這樣,我在哪裏可以找到文檔來幫助我開始使用它?
比較父視圖subviews
和arrangedSubviews
性質表明,iOS版添加視圖前者,而不是後者。 (這是iOS根據屬性檢查器中指定的不同特徵的「已安裝」複選框的變體來自適應佈局的情況。)
因此,需要將此特定子視圖插回排列的子視圖。我加入這個覆蓋到主視圖控制器(layout
是堆棧視圖,secondaryRow
是刪除/添加的根據屏幕的高度的按鍵排):
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if let index = layout.subviews.index(of: secondaryRow) {
layout.insertArrangedSubview(secondaryRow, at: index)
}
}
我敢肯定,這可以概括,可能會在佈局更改時同步所有UIStackView
的s subviews
和arrangedSubviews
。
我認爲當您通過重寫viewWillTransistion
方法更改方向時,您需要重新繪製視圖。
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
// When orientations changes draw the layout again
// by invalidating the current layout of the views
// For Example, if I want to redraw for UIStackView I will use
stackView.setNeedsLayout()
}
'UIStackView'沒有'invalidateLayout()'方法。我將堆棧視圖的'@ IBOutlet'拖到了我的視圖控制器中,並且我爲視圖控制器添加了'viewWillTransition'覆蓋,但Xcode不在堆棧視圖變量上顯示'invalidateLayout()'方法,並且我也無法在Apple的文檔中找到它。 –
我已經更新了答案。基本上需要調用其他視圖'setNeedsLayout'方法。 – Rahul
謝謝!不幸的是,它不能解決問題。我試着在行堆棧視圖及其父視圖中調用'setNeedsLayout()'。這個問題是否可能是其他地方記錄的常見問題? –
你說它「消失」了。它在哪裏?你如何讓它消失? 你是否在設置其「隱藏」屬性? –
@robmayoff我不知道它在哪裏:-)我所做的是爲緊湊高度引入一個變體,並取消選中該變體的「已安裝」屬性的複選框(使用屬性檢查器)。 –