2017-05-07 3 views
0

こんにちは、私は、コンパクトな高さのためにインストールされたプロパティの選択を解除ているためUIStackViewていますデバイスの回転後にサブビューが再表示された後、UIStackViewのサブビューの正しいレイアウトを維持するにはどうすればよいですか?

enter image description here

Interface Builderはポートレートモードでの要素を示し、風景モードで要素を非表示にします。私はポートレートモードでは、最初に、iPhoneシミュレータでアプリケーションを実行すると、要素は(ボタンの第2行)が正しくレンダリングされる:

enter image description here

要素は右に回転した後に消えます。ポートレートモードに戻って再び左回転させた後しかし、要素が(画面の左上を参照)が正しく表示されます。

enter image description here

は私が再び表示され、プログラム後の要素のレイアウトの世話をする必要がありますか?もしそうなら、どこでこれを始めるためのドキュメンテーションを見つけることができますか?

+0

あなたはそれが「消える」と言います。どこに行くの?あなたはどうやって消えさせますか? 'hidden'プロパティを設定していますか? –

+0

@robmayoff私はどこに行くのかわかりません:-)コンパクトな高さのバリエーションを導入し、そのバリエーションの「インストール済み」プロパティ(属性インスペクタを使用)のチェックボックスをオフにしました。 –

答えて

0

は、iOSが前者ではなく後者にビューを追加することを示しています。 (これは、属性インスペクタで指定されているように、iOSがさまざまな特性の「インストール済み」チェックボックスのバリエーションに基づいて適応レイアウトを処理するときです)。

この特定のサブビューは、配置されたサブビューに挿入する必要があります。 、私はそれを一般化することができると確信して

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

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

:私は、メインビューコントローラ(layoutスタック図であり、secondaryRowが除去されたボタンの列である/画面の高さに応じて添加)に、このオーバーライドを追加しましたおそらく、すべてがUIStackViewsubviewsarrangedSubviewsのレイアウトを変更したときに同期するようにしてください。

0

viewWillTransistionメソッドをオーバーライドして向きを変更したときに、再度ビューを再描画する必要があると思います。親ビューのsubviewsarrangedSubviews特性を比較

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()'を行スタックビューとその親スタックビューのどちらかで呼び出すことを試みました。この問題は他の場所で文書化されている共通の問題ですか? –

関連する問題