web-dev-qa-db-ja.com

Xcode 6のストーリーボードの「余白に制限」とは何ですか

自動レイアウトと制約を使って作業していますが、XCode 6にはConstrain to marginsオプションがあり、これはXCode 5には存在せず、デフォルトでチェックされています。

テストプロジェクトを作成してから、ViewControllerにUITableViewをビューと同じサイズに設定し、制約を追加しました

XCode 6 tableviewがビューと同じフレームを持っていてもここで見ることができますXCodeが制約として-16を加えることを提案するのに対して.

With Constrain to margin checked

「余白に拘束」オプションをオフにすると、XCode 5と同じように動作し、拘束として0を追加することを提案します。

With Constrain to margin UnChecked

また、[余白チェック]に[拘束]で制約を追加すると、XCode 5でストーリーボードファイルを開くことができなくなるため、XCode 6では間違いなく新しいものになることがわかりました。

うまくいけば、私は私の質問を正しく説明することができます。 「余白を制限する」が実際に何をするのか、そしていつ使うべきであるべきでないのかを理解したいのです。それが非常に単純で明白な何かであるならば、私は謝罪します。

編集

私は ここでの議論でレイアウトマージンについて何かを見つけました 、それがこれに関連しているかどうか疑問に思います。

245
Bhumit Mehta

マージンがiOS 8以前のすべてで完全なクラッシュを引き起こすだろう」と人々が不満を述べている理由はまったくわかりません。

Xibファイルまたはストーリーボードのマージンに関連して制約を設定するDOES NOT iOS7でアプリをクラッシュさせる、およびDOES NOT iOS7デバイスでもUIの違いを生じさせないコードのUIView.layoutMarginsおよびUIView.preservesSuperviewLayoutMarginsプロパティに触れない限り。

IOS8のマージンとは

レイアウトマージンは、サブビューをレイアウトするときにレイアウトシステムが使用できるUIViewの-​​interiorの周囲のパディングを表します。これにより、ビューのエッジとサブビューの間にギャップが確保されます。この点で、CSSのブロックに関連付けられているパディングプロパティに非常によく似ています。

enter image description here

デフォルトでは、UIViewの各辺には8ポイントのレイアウトマージンがあり、これはInterface Builderでは変更できません。ただし、iOS8でのみ使用可能なコードでUIView.layoutMarginsプロパティを設定することにより、これらの値を調整できます。

Editor> Canvas> Show Layout Rectangles:でIBにマージンを表示させることができます enter image description here

マージンは、ビューとサブビューのレイアウトに役立ちます。すべてのUIViewにはデフォルトでマージンが付いていますが、マージンに関連する制約を設定した場合にのみビューの配置に影響します。

マージンの使用方法

Interface Builderでマージンを使用する唯一の方法は、制約の設定中にmarginに対するrelativeオプションをチェックすることです。これは、制約をに向ける方法です。ビューをレイアウトするときに、エッジではなくマージンを使用します。

enter image description here

ビューとそのサブビューの間に主要な制約を設定する4つの異なる方法を見てみましょう。各制約について、説明されている最初の関連付けはサブビューの先頭、および2番目はスーパービューの先頭を確認します。細心の注意を払いたいのは、各制約端のmargin torelativeオプションのチェックおよびチェック解除ステータスです。これは、制約がビューのマージンまたはエッジに結び付けられるかどうかを定義するためです。

  1. 最初の項目(チェックを外す)、2番目の項目(チェック):この場合、サブビューの左端をスーパービューの左マージンに合わせる必要があることを宣言しています(この画像に示すように)。

enter image description here

  1. 最初の項目(チェック解除)、2番目の項目(チェック解除):両方ともエッジを使用して、マージンではない。この場合、サブビューの左端をスーパービューの左端に合わせるように宣言しています。

enter image description here

  1. 最初の項目(チェック)、2番目の項目(チェック解除):この場合、サブビューの左マージンをスーパービューの左エッジに揃えることを宣言しています。この種のレイアウトは、実際にはサブビューをスーパービューにオーバーラップさせます。

enter image description here

  1. 最初の項目(チェック)、2番目の項目(チェック)。これは、サブビューとスーパービューの両方に同じデフォルトのマージンがあるため、実際にはケース2と同じ効果があります。サブビューの左マージンをスーパービューの左マージンに合わせる必要があることを宣言しています。

enter image description here

マージンの良いところ

この新機能(iOS8)は、マージンを使用することにした場合にのみUI開発に影響します。

マージンを使用することにより、単一のプロパティの値を変更することにより、共有スーパービューとの共通の関係を共有する複数のサブビューの配置を調整できます。これは、関連するすべての制約を固定値で設定することよりも有利です。各値を1つずつ変更する代わりに、すべての間隔を更新する必要がある場合、スーパービューのマージンを1行で更新することにより、関連するすべての配置を同時に変更できるからです。このようなコード:

self.rootView.layoutMargins = UIEdgeInsetsMake(0, 50, 0, 0);

この利点を説明するために、次の場合、すべてのサブビューの左端がスーパービューの左マージンに揃えられます。したがって、スーパービューの左マージンを変更すると、すべてのサブビューに同時に影響します。

enter image description here

308
Scott Zhu

IOS 8では、スーパービューの境界自体ではなく、スーパービューの境界に対する定義済みのマージンを基準にして制約を定義することができます。はい、それは完全にあなたがドキュメントで指摘したレイアウトマージンに関連しています。利点の1つは、マージンを動的に定義したり、デバイスの種類ごとに異なった方法で定義し直したりできることです。レイアウトは、制約を変更することなくそれに応じて更新されます。

いつ使用するか:この新しい柔軟性を利用したい場合。

使用しない場合:iOS 7以下で実行することを目標としているすべてのアプリ用。

62
KPM

UIViewのプロパティはlayoutMarginsです。 Apple Docs を参照してください。基本的にレイアウトの余白が8,8,8,8(デフォルト)の場合、コンテナの余白の先頭のスペースが0の制約のx位置は8になります。 これはiOS 8以降でのみ使用可能です。

自分の制約をコンテナのマージンに入れたくないという人のために:

Ctrlキーを押しながらクリックしてドラッグすると、制約作成ポップアップが表示されます。

デフォルトでマージンに対する制約を作成するようにメニューが表示された場合は、オプション/ altを押したままにして、コンテナのマージンではなくコンテナに対して制約を設定できるようにします。

これで、マージンではなく制約を作成するオプションが表示されます。これは私の用法ではWAY速くなります。

42
Kyle Robson