Xcode 6のストーリーボードの「マージンに制限」とは


249

自動レイアウトと制約を使用していて、 Constrain to marginsますが、Xcode 6にはXcode 5にはなかっオプションデフォルトでチェックされています。

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

Xcode 6 これは、tableviewのフレームがビューXcodeが制約として-16を追加することを提案しているのと同じフレームですが、Xcode 5は間隔0を追加することを提案していますが、ここに表示されます。

マージンへの制約がチェックされている

「マージンに制約」オプションのチェックを外すと、Xcode 5と同じように動作し、制約として0を追加することを提案します

マージンへの制約ありチェックなし

また、[マージンへの制約]チェックをオンにして制約を追加すると、ストーリーボードファイルをXcode 5で開くことができなくなり、Xcode 6で間違いなく新しいものになることがわかりました。

うまくいけば、私は私の質問を適切に説明することができます。「Constrain to margin」が実際に行うことと、いつ使用すべきか、使用すべきでないかを理解したいと思います。それが非常にシンプルで明白なものである場合は、謝罪します。

編集

私はここでの議論でレイアウトの余白について何かを見つけました、それはこれに関連しているのだろうかと思います。


15
謝罪する必要はありません-それが何をしているのか明らかではありません。
ベンクレイトン

4
+1謝罪する必要はありません。私もこの質問をしたかったのです。ところで:Xcode5でストーリーボードを開くには、次をご覧ください:stackoverflow.com/a/25298909/529243
Olaf

1
これは私が見つけた説明に最も近いものです。stackoverflow.com
Nathaniel

これを無効にする方法は?
Orkenstein

2
ええ、それは本当の痛みです。完全にチェックを外す方法がわかりません。
Bhumit Mehta 2014

回答:


315

人々は「ことを訴えている理由は、私は全く理解していない余白が前のiOS 8には何の上に完全にクラッシュを引き起こします

XIBファイルやストーリーボードにマージンに対するあなたの制約を設定することはしません iOS7にアプリのクラッシュを作り、それはしません限り、あなたは触れていないとして、どちらもお使いiOS7デバイス上のUIの違いを確認しないUIView.layoutMarginsUIView.preservesSuperviewLayoutMargins、あなたのコード内でプロパティを。

iOS8のマージンとは

レイアウトマージンは、レイアウトシステムがサブビューのレイアウト時に使用できるの内部のパディングを表しますUIView。ビューのエッジとサブビューの間にギャップが残るようにするためです。この点で、CSSのブロックに関連付けられているパディングプロパティによく似ています。

ここに画像の説明を入力してください

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

Editor> Canvas> Show Layout Rectanglesで IBを取得してマージンを表示できます ここに画像の説明を入力してください

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

マージンの使い方

Interface Builderでマージンを使用する唯一の方法は、制約を構成するときにRelative to marginオプションをチェックすることです。これは、ビューをレイアウトするときに制約をエッジではなくマージン使用するように指示する方法です

ここに画像の説明を入力してください

ビューとそのサブビューの間に主要な制約を設定する4つの異なる方法を見てみましょう。制約ごとに、最初に説明した関連付けを確認します。関連付けはサブビューのリーディングであり、2番目はスーパービューのリーディングです。制約がビューのマージンまたはエッジに関連付けられているかどうかを定義するため、注意が必要なのは、各制約の端の[ マージンに相対的 ]オプションのチェックとチェック解除のステータスです。

  1. 最初のアイテム(チェックを外す)、2番目のアイテム(チェック):この場合、サブビューの左端をスーパービューの左マージンに揃えるように宣言します(この図に示すように)。

ここに画像の説明を入力してください

  1. 最初のアイテム(チェック解除)、2番目のアイテム(チェック解除):どちらもマージンはなくエッジを使用します。この場合、サブビューの左端をスーパービューの左端に揃える必要があることを宣言しています。

ここに画像の説明を入力してください

  1. 最初のアイテム(チェック)、2番目のアイテム(チェック解除):この場合、サブビューの左マージンをスーパービューの左端に揃える必要があることを宣言しています。この種類のレイアウトは、実際にはサブビューをスーパービューに重ねます。

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

マージンの良いところ

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

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

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

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

ここに画像の説明を入力してください


詳しい説明ありがとうございます。これは事をうまく説明しているので、これを受け入れられた回答としてマークしています。
Bhumit Mehta 2015

@Bhumitに感謝します。この回答が役に立てば幸いです。
Scott Zhu

4
「私はなぜ人々が不満を言っているのか全く理解していません」。まあ、おそらく最後のベータの1つで動作が変わったのかもしれませんが、私はチェックしていません。しかし、少なくとも数か月前は、コードにlayoutMarginsを設定しなかった場合でも、クラッシュが発生しました。
KPM 2015

新しい制約を追加するとき、Xcodeの新しいバージョンでは、同じ「マージンから相対」フラグを設定する「制約からマージン」のボックスのチェックを外すことができることを指摘することは価値があります。数回のクリックを節約できるため、これは便利です。正解です。ところで説明しました。画像は非常に役に立ちました。
EricWasTaken 2015

写真はDropboxでホストされていることに注意しました。SOでイメージをホストした方がいいのではないでしょうか。
2015年

63

iOS 8では、スーパービューの境界自体ではなく、スーパービューの境界に対する事前定義されたマージンに関連する制約を定義するオプションが利用できるようになりました。はい、ドキュメントで指摘したレイアウトマージンに完全に関連しています。1つの利点は、マージンを動的に再定義するか、デバイスの種類ごとに異なるように再定義することができ、レイアウトは制約を変更せずに対応して更新されることです。

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

使用しない場合:iOS 7以下で実行することをターゲットとするすべてのアプリ。


21
それはまだ何のあからさまなクラッシュの原因前のiOS 8にデフォルトで有効になっていなかった場合、これは便利な機能だろう
TylerJames

1
これ以上同意できませんでした。
KPM

42

UIViewのプロパティは次のとおりlayoutMarginsです。Apple Docsを参照してください。基本的に、レイアウトマージンが8,8,8,8(デフォルト)の場合、コンテナーマージンまでの先行スペースが0の制約のx位置は8になります。これはiOS8以降でのみ使用できることに注意してください。

コンテナのマージンに制約を課したくないすべての人のために:

CTRL +クリック+ドラッグして、制約作成ポップアップを表示します。

メニューがデフォルトでマージンへの制約を作成することを示している場合は、option / altを押したままにして、コンテナーのマージンではなくコンテナーに制約を適用できるようにします。

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


3
これはおそらく私が見つけた最良の解決策です。「マージンに制限」のチェックを外すと、常に機能するとは限らず、少し不思議に感じます。これは完璧です。
Levi McCallum 14

いったいなぜデフォルトが10ptではないのですか?
ZaBlanc、2015年

11
Appleには、ユーザビリティの調査に基づいて長さとサイズを選択してきた歴史があります。たとえば、多くのもののデフォルトの高さは44または35 ptです。@ZaBlanc
カイル・ロブソン、

デフォルトでマージンなしでストーリーボードに制約を追加する場合の完璧なソリューション。ありがとうございました!
inix 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.