2017-05-07 57 views
0

喜有,我已經取消了安裝屬性緊湊高地UIStackView設備旋轉後子視圖重新出現後,如何保持UIStackView子視圖的正確佈局?

enter image description here

界面生成器會顯示在縱向模式下的元素並隱藏在橫向模式下的元素。當我在縱向模式下運行在iPhone模擬器應用程序,最初,元件被正確地呈現(按鈕的第二行):旋轉右後

enter image description here

元件消失。但是旋轉又走回到縱向模式後,該元素呈現不正確(見屏幕的左上角):

enter image description here

我需要再次出現後,以編程方式照顧元素的佈局呢?如果是這樣,我在哪裏可以找到文檔來幫助我開始使用它?

+0

你說它「消失」了。它在哪裏?你如何讓它消失? 你是否在設置其「隱藏」屬性? –

+0

@robmayoff我不知道它在哪裏:-)我所做的是爲緊湊高度引入一個變體,並取消選中該變體的「已安裝」屬性的複選框(使用屬性檢查器)。 –

回答

0

比較父視圖subviewsarrangedSubviews性質表明,iOS版添加視圖前者,而不是後者。 (這是iOS根據屬性檢查器中指定的不同特徵的「已安裝」複選框的變體來自適應佈局的情況。)

因此,需要將此特定子視圖插回排列的子視圖。我加入這個覆蓋到主視圖控制器(layout是堆棧視圖,secondaryRow是刪除/添加的根據屏幕的高度的按鍵排):

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    if let index = layout.subviews.index(of: secondaryRow) { 
     layout.insertArrangedSubview(secondaryRow, at: index) 
    } 
} 

我敢肯定,這可以概括,可能會在佈局更改時同步所有UIStackView的s subviewsarrangedSubviews

0

我認爲當您通過重寫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() 
} 
+0

'UIStackView'沒有'invalidateLayout()'方法。我將堆棧視圖的'@ IBOutlet'拖到了我的視圖控制器中,並且我爲視圖控制器添加了'viewWillTransition'覆蓋,但Xcode不在堆棧視圖變量上顯示'invalidateLayout()'方法,並且我也無法在Apple的文檔中找到它。 –

+0

我已經更新了答案。基本上需要調用其他視圖'setNeedsLayout'方法。 – Rahul

+0

謝謝!不幸的是,它不能解決問題。我試着在行堆棧視圖及其父視圖中調用'setNeedsLayout()'。這個問題是否可能是其他地方記錄的常見問題? –