web-dev-qa-db-ja.com

アンカー操作に匹敵する、iPhone 5とiPhone 4の間でサイズ変更する制約ベースのビューを作成するにはどうすればよいですか?

私が理解しているのは、古典的なスプリングとストラット、別名「アンカーと整列」、または「マスクの自動化」の種類のみです。ただし、XCode 4.6では、iOS 6で導入された制約を使用する「自動レイアウト」がデフォルトであり、方法を学ぶと、新しい配置の全世界を可能にしながら、特定の単純なことを難しくします。 (明確にするために、一部のユーザーは自動レイアウトの戦いと戦わずに動作するシンプルなビューを取得することだけを気にするかもしれないので、マットによって自動レイアウトをオフにする回避策が早期に提案されました。

iOS 6 Layout Constraints、編集制約のInterface Builderシステム、わかりません。

enter image description here

XCode Interface Builderが(ビューの端などに)自動的に制約を作成する場所では、私が理解しているように動作するようです。

私が理解していないのは、ここに示されている.xibで、また利用可能です here 、なぜ緑とマゼンタの領域を取得して一定の境界(それらの間の白い領域)を維持できないのかそれは、ビューのサイズがどうなるかに関係なく、厚くも薄くもなりません。

つまり、緑色の領域は垂直方向にサイズ変更せず、水平方向にのみサイズ変更する必要がありますが、フォームの下部に固定することを主張しており、新しい空のペン先から再び開始するが、インターフェイスビルダーを復元して、再び緑とマゼンタビュー、インターフェイスビルダーが「愚か」になると、親ビューの下端からの距離の観点から緑色のビューの下端を定義することのみを要求し、(その他の操作は一切行いません)単なるドラッグアンドドロップ操作。ピンコマンドも試してみましたが、機能するピンコマンドは見つかりませんでした。

インターフェイスビルダーメニューとの戦いやドラッグアンドドロップでは、制約の1つを手放すには十分ではないようです。私は何をすべきかわからない。制約を削除しますか?どうやって? [IBオブジェクト]ペインまたは[ユーティリティ]-> [サイズインスペクタ]のいずれかから、表示される限り、制約をまったく削除できません。削除オプションはありますが、制約領域の「歯車」アイコンボタンをクリックすると表示されるドロップダウンメニューでグレー表示されます。

ビューが広くなるにつれて緑の領域のサイズが変更されるのが理想的ですが、高さや短さは変更されません。これは他のすべてのツールで明らかであると思いましたが、XCode + Autolayoutでは、サイズ変更がまったく行われないか、4方向すべてのサイズが変更されます。やりたくないことをしている制約を削除または削除することはできません。別のビューの内側にある各ビューに4つの制約が必要ですか?

(更新1:あいまいなレイアウトまたは未指定のレイアウトにつながる制約を削除することはできません。)

(更新2:uiviewペインが兄弟にスナップしない場合、そのuiviewを削除して再試行すると、兄弟に自然に「スナップ」できるようになり、制約は兄弟ビューオブジェクトの代わりに兄弟ビューオブジェクトに関連して作成されます親。)

(更新3:マットは回避策を削除しました。以下に再現しました。)

そもそもオートレイアウトを必要とせず、古いスプリングとストラットを戻したいだけの人のための回避策:

ステップ1:自動レイアウトをオフにする:

enter image description here

ステップ2:正しい自動サイズ変更マスクを選択します。

enter image description here

22
Warren P

インターフェイスビルダーで制約を編集するための重要な点は、ビューに追加した制約をドラッグアンドドロップしないことです。代わりに制約を編集して、物を移動および配置します。固定メニューを使用して、新しい制約を作成します。自動的に追加されたシステム制約を明確に置き換えるのに十分な新しい制約を追加したら、不要な制約を削除できます。

あなたの場合、次の制約を作成しました。

enter image description here

ドキュメントナビゲーターをわかりやすくするために、ビューの名前を「Green」と「Magenta」に変更しました。私がやったことは:

  • ビュー間の垂直間隔を固定する
  • 各ビューを左右に固定しました
  • スーパービューの上部から設定された高さと設定された距離にトップビューを固定しました
  • 底面図の下部をスーパービューの下部に固定しました。

これにより、必要なレイアウトが得られます。もっと詳しく知りたい場合は、この here について、非常に詳細に記述しました。

12
jrturton

これは、新しいiOS6自動レイアウトモードをオフにしたくない場合の答えです。

最上位ビューとすべてのサブレベルビューの表示モードが[全体に拡大縮小]の場合、この制約を削除できないため、この場合はアンカーモード「以下」を使用します。 2つの色付きビューは、サイズ(幅、高さ)または位置(左上隅)としてペン先に保存されるのではなく、レイアウトを表す制約付きで保存されます。 「等しい」の代わりに「より小さい」または「等しい」レイアウトにアクセスするには、上部の正方形をクリックします。次に4つの制約線が表示され、選択したコントロールの下部エッジから下部に向かう下部のラインを選択しますビューを選択し、タイプを「等しい」から「より小さい」または「等しい」に変更します。

enter image description here

ビューモードが[拡大縮小]ではない場合、他の制約の変更が必要になります。この多面的なデザインは、古い「スプリングとストラット」よりも柔軟性がありますが、学ぶのはそれほど簡単ではありません。

使用できるより明白なモードは、2つのオブジェクトの間に制約を取得することです。なぜこれがそんなに難しいのか(時々これを行うことができますが、時にはできないのです)まだわかりません。

オブジェクトからその親ビューにではなく、2つのオブジェクトの間に制約を表示することができたサンプルを次に示しますが、この状況では、Interface Builderを常に連携させることができれば、はるかに直感的な方法になります一番上の正方形がビュー全体の高さに固定されていない状況を作成します。

enter image description here

上の色のビューにその下のビューへのアンカーがある場合、これは逆の制約が同じビューに対してできないことを意味します。さもないと、あいまいさまたは「循環推論」状況が存在します。したがって、AをBに依存させることはできますが、Bは同時にAに依存させることはできません。その場合、ビューの絶対的な高さまたは幅に依存するように制約が切り替えられます。私が見つけたこの特定のケースでは、改善される前に以前は信じられないほど直感的にできたことを再現するために、かなりの試行錯誤が必要と思われます。

最後に、上記の手順は、余分な制約が生じたときに機能しないように見えることがわかります。非常に微妙に、次のように1行ではなく2行が表示されるはずです。

enter image description here

制約をEqualsからLess thanまたはEqualに変更するだけで、Interface Builderで重複する制約を追加し続けることができます。これはXCode 4.6のインターフェイスビルダーのバグであり、レイアウトの制約はCococaTouchの比較的新しい部分であるため、インターフェイスビルダーがアイテムをドラッグおよび移動する際の制約の自動作成をサポートしていることは驚くことではありません。

2
Warren P