2017-12-04 11 views
3

私は、特性のコレクションに応じて、特定のサブビュー、ラベルなどを非表示にするビューコントローラを用意しています。例えば、私は水平にコンパクトにするときに隠したい側にラベルを、縦にコンパクトにしたいときに上と下にラベルを付けたいと思う。UIStackViewは、回転とビューのレイアウトを非表示にしています

インターフェイスのセクション全体を非表示にしたいので、UIStackViewがこれを簡単にするように思えます。同様に、私はInterface Builder/Xcode(9.1 9B55)のコードではなく、できるだけ多くのことをやろうとしています。

  • は常にアスペクト比1:

    設計の主な要素は、チェスボード、ある1

  • がビュー内で可能な限り大きい

そしてラベルとその周辺の他のアイテム私は、現在の特集コレクションに基づいて移動して隠したいと思っています。

私は水平スタックビュー、アライメント、および分布を「塗りつぶし」に設定することから始めました。その中には、boardView(紫色)とlabelView(黄色)という2つの項目があります。

labelViewには2つのラベルがあり、これらのラベルのレイアウトのためにビュー内に制約が設定されています。

boardViewは、アスペクト比の制約1があります(1000年@)1:

enter image description here

私は(下を除く)スーパーにそれをピン留め、スタックビューに対して次の制約を設定:

  • 安全Area.trailing =スタックView.trailing(1000年@)(1000年@)
  • 安全Area.leading =スタックView.leading
  • 安全Area.top(1000年@)=スタックView.top(1000年@)
  • 安全Area.bottom> =スタックView.bottom

私はboardViewを保証するために、これらの制約を設定するには、スーパーをオーバーフローしたことがありません。

  • boardView.width < =安全Area.width(1000年@)
  • boardView.height < =安全Area.height(1000年@)

可能であれば(これらは上記よりも低い優先度であるためではなく、オーバーフロー)、そのように私が低い優先順位でこれらの制約を設定し、幅または高さがスーパーを埋めるために展開されます:

  • boardView。幅=安全Area.width(250 @)
  • (250 @)boardView.height =安全Area.height

これはすべての偉大な動作するようです。私が期待するようXcodeとアプリ内のエラーが振る舞うない、肖像画や風景の中に(iPhone 8シミュレータからこれらのスクリーンショット):私は右のビューを非表示にしようとすると

enter image description here enter image description here

問題が来ます。私は私たちが正規のモードで垂直になっているときにnameViewを隠すことによってこれをしようとしています。私はnameViewを選択し、インストール済みのチェックボックスの横の+をクリックし、選択HR:

enter image description here

そして時間インストール]チェックボックスをオフには:

enter image description here

これはXcodeの中に偉大に見えます。エラーとIBいいえ(名前ラベルが隠されている)私は風景や肖像画の両方で期待されるように、すべてのビューを示しているように見えるん:

enter image description here enter image description here

これまでのところ、とても良いです。実際、私がそれを実行すると、当初期待していたように見えます。私たちは風景の中に、シミュレータを起動した場合、それはよさそうだ:

enter image description here

我々は肖像画でシミュレータを起動した場合、それはよさそうだ:

enter image description here

だから、問題は何ですか?まあ、できるだけ早く我々は肖像画から風景まで回転するよう、レイアウトは完全に間違っている:

enter image description here

同時に、我々は、コンソールにLayoutConstraintsのエラーが表示されます。

2017-12-03 19:25:55.710381-0600 TestLayoutSIngleView[31439:3231004] [LayoutConstraints] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fixes it. 
(
    "<NSLayoutConstraint:0x60400009b8a0 UIView:0x7fe920603e90.width == UIView:0x7fe920603e90.height (active)>", 
    "<NSLayoutConstraint:0x60000009ced0 UIStackView:0x7fe92050bd70.leading == UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide'.leading (active)>", 
    "<NSLayoutConstraint:0x60000009d100 UIStackView:0x7fe92050bd70.top == UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide'.top (active)>", 
    "<NSLayoutConstraint:0x60000009d150 UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide'.trailing == UIStackView:0x7fe92050bd70.trailing (active)>", 
    "<NSLayoutConstraint:0x60000009d1a0 UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide'.bottom >= UIStackView:0x7fe92050bd70.bottom (active)>", 
    "<NSLayoutConstraint:0x60000009e5a0 'UISV-canvas-connection' UIStackView:0x7fe92050bd70.leading == UIView:0x7fe920603e90.leading (active)>", 
    "<NSLayoutConstraint:0x60000009ce30 'UISV-canvas-connection' UIStackView:0x7fe92050bd70.top == UIView:0x7fe920603e90.top (active)>", 
    "<NSLayoutConstraint:0x60000009e5f0 'UISV-canvas-connection' V:[UIView:0x7fe920603e90]-(0)-| (active, names: '|':UIStackView:0x7fe92050bd70)>", 
    "<NSLayoutConstraint:0x60000009cde0 'UISV-canvas-connection' H:[UIView:0x7fe920603e90]-(0)-| (active, names: '|':UIStackView:0x7fe92050bd70)>", 
    "<NSLayoutConstraint:0x60000009e7d0 'UIView-Encapsulated-Layout-Height' UIView:0x7fe92050b8f0.height == 375 (active)>", 
    "<NSLayoutConstraint:0x60000009e780 'UIView-Encapsulated-Layout-Width' UIView:0x7fe92050b8f0.width == 667 (active)>", 
    "<NSLayoutConstraint:0x60000009d060 'UIViewSafeAreaLayoutGuide-bottom' V:[UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide']-(0)-| (active, names: '|':UIView:0x7fe92050b8f0)>", 
    "<NSLayoutConstraint:0x60000009d010 'UIViewSafeAreaLayoutGuide-left' H:|-(0)-[UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide'](LTR) (active, names: '|':UIView:0x7fe92050b8f0)>", 
    "<NSLayoutConstraint:0x60000009d0b0 'UIViewSafeAreaLayoutGuide-right' H:[UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide']-(0)-|(LTR) (active, names: '|':UIView:0x7fe92050b8f0)>", 
    "<NSLayoutConstraint:0x60000009cfc0 'UIViewSafeAreaLayoutGuide-top' V:|-(0)-[UILayoutGuide:0x6000001b5d20'UIViewSafeAreaLayoutGuide'] (active, names: '|':UIView:0x7fe92050b8f0)>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x60400009b8a0 UIView:0x7fe920603e90.width == UIView:0x7fe920603e90.height (active)> 

私は好きUIStackViewを使用して自動レイアウトを作成し、ビューを簡単に隠すアイデアしかし、コンパイルして実行したときにXcodeで表示される内容がうまくいかない場合、これは難しいようです。

私は間違っていますか(または私はXcodeのバグにぶつかっていますか)?

私は上記を実証GitHubのプロジェクト作成:私があれば、我々は風景の中に、このビューを非表示にしたことを、上記の全てを書き終えたとして、それは私に発生した.... https://github.com/johnstewart/TestLayoutSIngleView

編集をモードでは、レイアウトは充足できないでしょう...しかし、私はこの風景を風景に隠すわけではなく、肖像画だけです。何らかの理由で、iOSが回転前にレイアウトを変更しています。

私は750に1000年からこのの優先順位を設定した場合:

  • 安全Area.trailing =スタックView.trailing(1000年@)

...私はいずれかを得ることはありませんコンソール上の自動レイアウトエラー。しかし、一度回転した風景ビューはまったく正しい場所にものを持っていません。

スタックビューはすぐにそれの余地が今そこにあるにもかかわらず、風景に肖像画から回転を始めるに縮小、回転の完了時にその縮んだ状態でスタック表示を残しているかのようにです:

enter image description here

は、私は心から他の私はアンインストールUIStackViewで形質コレクションに基づく見解は全く可能である方法を見ていない...私はここに何かを明らかに欠けている願っています。これは簡単な例のように思える(それはある、私は追加するには多くのものを持っている!)

編集:私はこの手法はWWDC2017からで見た

WWDCのビデオ、インタフェースにおける自動レイアウトのテクニックビルダー(https://developer.apple.com/videos/play/wwdc2017/412/)。このデモは29:00に始まります。

しかし、私が間違っていたのは、このために使用されていた「インストール済み」のプロパティでした。受け入れられた答えが示しているように、「隠し」がそれを行う方法でした。

+0

アップデート20171205 - Xcodeの9.2(9C40b)に更新され、それはです同じ挙動。 –

答えて

2

私はあなたが「インストール」プロパティなしであなたが望むものを達成することができると思う: だけ設定ポートレートモード用の「隠れた」:enter image description here

enter image description here

+0

私はこれをちょっと試してみましたが、本当に私の問題を解決するわけではありません。 hRでnameViewを非表示にすると、nameView内の項目の制約にエラーが発生します。それらも隠しておくことができますが、レイアウトがこの(非常に最小限に抑えられた)例よりも複雑な場合、これは拡大縮小していないようです。 –

+0

'installed'プロパティの問題は、 'アンインストール'後にコントローラが' leftView'を取得できないことです。これはスーパービューから削除され、コントローラはvibのライフサイクルの開始時にのみ発生するため、xibからロードできませんでした。 解決策は、 'viewViewMillTransitionToSize:withTransitionCoordinator:'メソッドで 'leftView'と' stackView'にアウトレットを使用し、 '[self.stackView removeArrangedSubview:self.leftView];と' [self.stackView addArrangedSubview:self.leftView];を呼び出します画面の向きに依存します。 – Josshad

+0

I * swear * WWDCビデオでUIStackViewの一部を隠してしまったことがわかりました。なぜなら、これはIBのビューを削除することを「アップルの方法」と考えていたからです。私は参照スタックビューを見つけることができるすべてのWWDCビデオを見てきましたが、これまで私はそれを見つけることはできません。 –

関連する問題