IOSコミュニティでは、レイアウトに関していくつかの異なるオプション/用語と人々が使用しているようです(たとえば、UIEdgeInsetsはタイプですが、「インセットの設定」またはレイアウトマージンとレイアウトガイドの違いを聞く/読む)。
私は常に機能するオプションを見つけることができました。しかし、私はその仕事に適したツールを使用しているとは決して確信していません。
誰かがこれらのレイアウトのさまざまな側面と、それぞれを最良の方法でいつ使用するかを明確にする手助けをすることができますか?
バウンティの提供者であること...私の混乱の大部分は、 UILayoutGuide
クラスを適切に理解していないことが原因だと思います。それが鍵ですが、非常にシンプルでもあります。
最初に problem を紹介しましょう:
昔は、これらの円を次のように制限する必要がある場合:
次に、clearUIViewsを作成してサブビューとして追加し、以下のように制約を追加する必要がありました。
今日は、それらをサブビューとして追加する必要はありません。代わりに、単に
レイアウトガイドを作成するには、次の手順を実行する必要があります。
addLayoutGuide(_:)
メソッドを呼び出して、レイアウトガイドをビューに追加します。手順:
let space1 = UILayoutGuide()
view.addLayoutGuide(space1)
let space2 = UILayoutGuide()
view.addLayoutGuide(space2)
space1.widthAnchor.constraintEqualToAnchor(space2.widthAnchor).active = true
saveButton.trailingAnchor.constraintEqualToAnchor(space1.leadingAnchor).active = true
cancelButton.leadingAnchor.constraintEqualToAnchor(space1.trailingAnchor).active = true
cancelButton.trailingAnchor.constraintEqualToAnchor(space2.leadingAnchor).active = true
clearButton.leadingAnchor.constraintEqualToAnchor(space2.trailingAnchor).active = true
レイアウトガイドは、他の多くのビューやコントロールを含むブラックボックスとしても機能します。これにより、ビューの一部をカプセル化して、レイアウトをモジュール化したチャンクに分割できます。
3つの興味深いメモ:
UILayoutGuide
のインスタンスがさらに表示されます。詳細については、 documentation を参照してください。
topLayoutGuide
対 safeAreaLayoutGuide
これは非推奨ですが、学習目的のためです:UIViewController
には2つのダミーボックスがあります。上部の1つのプロパティはtopLayoutGuide
という名前で、下部の別のプロパティはbottomLayoutGuide
という名前です。 viewController自体には、左側/先頭または右側/末尾のガイドはありません。これらは両方ともUILayoutGuide
のインスタンスです
view.topAnchorに制限されている場合、つまり:
tableView.topAnchor.constraint(equalTo: view.topAnchor)
tableViewは、navigationBarの下部から開始しません
topLayoutGuide.bottomAnchor
に制限されている場合、つまり:
tableView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor)
tableViewは、navigationBarの下部から始まります
また、レイアウト設計によっては、コンテンツをナビゲーションバーの下にぼかしたい場合があります。
そして、あなたのコンテンツをエッジからエッジまで表示するという考えでした。そしてそれはバーを重ねるので、バーを介してコンテンツでこれらの素敵なカラフルなぼかしを得ることができます
詳細については、この WWDCの瞬間 とこの質問 here を参照してください。ソリューションは正確に関連しているとは思いません。問題の画像だけです。
iOS11以降
Appleは
topLayoutGuide
およびbottomLayoutGuide
を廃止しました。したがって、2つのダミーボックスを持つ代わりに、UIViewインスタンスにsafeAreaLayoutGuide
という名前のダミーボックスが1つあります。 UIViewControllerにはこれがなくなりました... useyourloaf からコピーされた視覚的な比較:
補足:ストーリーボードを使用する場合、ビューをtopLayoutGuideまたはsafeAreaLayoutGuideの上に揃えると、同じようにレンダリングされます。ストーリーボードを使用しない場合(プログラムでそれを行う場合)、iOS11とLessThaniOS11の間で踊り、2つの異なるバージョンのコードを使用する必要があります。
safeAreaLayoutGuide
の詳細については、 次のAppleの記事を設定することをお勧めしますhighly。コンテンツ相対配置安全なエリアへ
注:safeAreaLayoutGuide
はUIViewプロパティです。 topLayoutGuide
はUIViewControllerプロパティです。
layoutMarginsGuide
UIView
にはダミーボックスが1つしかありません。プロパティの名前はlayoutMarginsGuide
です。ただし、UIViewController
とは異なり、上部または下部にありません。それはちょうどUIView
。への8ポイントのパディング/インセット(== --- ==)で中央に座っているので、これはどこで役に立ちますか? : これは、textViewをUIViewインスタンスのエッジに制約するしない場合に使用します。これにより、読書体験が向上します。または、スーパービューのLeadingAnchorにボタンを制限して醜い外観にする代わりに、アンカーに8ポイントを追加します。つまり、ボタンをLeadingAnchorに制限してから、8つの定数ポイントを追加します。 取り消し線付きのテキストは、実際にreadableContentGuide
を使用する場所です。layoutMarginsGuide
は、ボタンまたはラベルが不要な場合に便利ですそのスーパービューの端に
someButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8)
しかし、もっと簡単な方法があります。 Appleの推奨マージンを使用してください。
someButton.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor)
documentation にある例も参照してください。良いRaywenderlichチュートリアルは here にあります
readableContentGuide
layoutMarginGuide
とは少し異なります。どちらもUIViewのプロパティです。時々それらは同一である場合もあれば、そうでない場合もあります。その目的は次のとおりです。
このレイアウトガイドは、ユーザーに頭を動かしてラインを追跡させることなく、簡単に読むことができる領域を定義します
詳細については、 WWDCからのこの瞬間:アダプティブレイアウトの構築 およびこの素晴らしい useyourloafチュートリアル を参照してください。
IPhone 7 Plusでは、縦向きでは、読みやすいコンテンツガイドはビューのマージンガイドと同じですが、横向きでは、テキストビューの両側に余白があります。 iPadの横向きでは、余白が大幅に増加します。
マージンサイズは、システムの動的タイプによって異なります。フォントが大きいほど、ガイドの幅が広くなります。
下の画像では、シアンはlayoutMarginGuide
に固定されていますが、グリーンはreadableContentGuide
に固定されています。
UIEdgeInsets
layoutMarginsGuide
を変更する場合、つまり、必要なマージンを8ポイントから16ポイントに変更する場合は、layoutMargins
の値を変更してから、layoutMarginsGuide
'sanchorsは自動的に更新されます。 UIEdgeInsets
は、layoutMargins
のtypeにすぎません。 layoutMargins
はUIView
クラスのプロパティnameです
someview.layoutMargins = UIEdgeInsets(top: 50, left: 50, bottom: 50, right: 50)
このコードfound️が効果を発揮する唯一の場所はviewDidLayoutSubviews
内です。詳細については、 こちら を参照してください
Anchors
これらは基本的なものですが、特別なものはありません。これらは、UIView/UILayoutGuideの最も遠いエッジです。 UIViewとUILayoutGuideの両方のインスタンスにそれがあります。 [〜#〜]すべて[〜#〜]制約は最終的にアンカーを使用して制約されます。これはtoの問題ですあなたがそれをアンカーしているものエンティティのアンカー。 safeAreaLayoutGuide
のアンカー、layoutMarginGuide
のアンカー、topLayoutGuide
のアンカー、view
のアンカーのいずれかになります。 (heightAnchorを50に固定することもできるので、その場合、別のアンカーはありません)
layoutMarginsGuide
とAnchors
のgreat視覚的比較は、この answerから見つけることができます 。ストーリーボードを使用して行われるため、理解が容易になります。
contentInsets
理解することは重要ですが、まったく異なる議論であり、他の人とは何の関係もありません。 UIScrollViewsに固有です。詳細については、 この素晴らしい記事 を参照してください
安全ですべてがの内側であることを確認するには、ビューをsafeAreaLayoutGuide
を使用します。システムが提供するマージンを使用してビューのレイアウトを改善したり、一部のパディングを追加したりする場合は、layoutMarginGuide
を使用してください。読みやすくするには、readableContentGuide
を使用します。
readableContentGuide
のサイズは常にlayoutMarginGuide
以下です。layoutMarginGuide
のサイズは常にsafeAreaLayoutGuide
より小さいか等しい
layoutMargins
はCSSのパディングと非常に似ています。 safeAreaLayoutGuide
はCSSマージンに似ています。 readableContentGuide
に相当するCSSがあるかどうかわかりません
これらはscrollViews用であり、他の回答とは多少関係ありません。 contentInset
とcontentOffset
については、 WWDC 2018のこの瞬間:UIKit:Apps for Every Size and Shape をご覧ください。ビデオはとてもシンプルです。以下のKarthikの回答も参照してください。そうは言っても、scrollViewがどのように機能するかを完全に理解し、contentSize
が何であるかを理解することが重要です。そうでなければ、複雑になります。 contentSize
とscrollViewの詳細については、 Vacawamaの回答はこちらをご覧ください
これが退屈な答えである場合は申し訳ありませんが、Apple開発者向けドキュメントは、各UIViewプロパティがどのように使用されることが意図されているかを説明するのにかなり優れていると思います。
機能する複数のメソッド/オプションがある場合にレイアウトを実装する最良の方法については...それは本当にスタイル/意見の問題です。次の基準に焦点を当てて決定を下します。
チームはこの基準を使用して協力し、各シナリオで「UIのレイアウト方法」について合意することができます。あなたが求めているのは、そのようなディスカッションの合計結果である、レイアウトスタイルのガイドです。
私の経験では、これは私が取り組んだチームで常に有機的に発展しており、実際には書き留められていませんでした。上記のポイント3のはるかに多くのことでした。
質問で説明されているクラスのAppleドキュメントからの抜粋:
オン ILayoutGuide :
ユーザーインターフェイスでビュー間スペースまたはカプセル化を表すために作成したダミービューを置き換えるには、レイアウトガイドを使用します。従来、ダミービューを必要とする多くの自動レイアウト手法がありました。
...
UILayoutGuideクラスは、ダミービューによって以前に実行されたすべてのタスクを実行するように設計されていますが、より安全で効率的な方法で実行するように設計されています。
オン layoutMargins :
IOS 11以降では、このプロパティの代わりにdirectionalLayoutMarginsプロパティを使用してレイアウトマージンを指定します。
このプロパティを使用して、このビューのエッジとそのサブビューの間の望ましい間隔(ポイント単位)を指定します。先行マージンと後続マージンは、現在のレイアウト方向に基づいて、左マージンまたは右マージンに適切に適用されます。
オン contentInset :
このプロパティを使用して、コンテンツとコンテンツビューの端の間のスペースを拡張します。サイズの単位はポイントです。デフォルト値はUIEdgeInsetsZeroです。
オン topAnchor :
このアンカーを使用して、ビューの上端に拘束を作成します。このアンカーは、他のNSLayoutYAxisAnchorアンカーとのみ組み合わせることができます。詳細については、NSLayoutAnchorを参照してください。
これらの制約を使用して、自動レイアウトを使用してプログラムでレイアウトを定義します。 NSLayoutConstraintオブジェクトを直接作成する代わりに、制約するUIView、NSView、またはUILayoutGuideオブジェクトから始め、そのオブジェクトのアンカープロパティの1つを選択します。これらのプロパティは、自動レイアウトで使用されるメインのNSLayoutConstraint.Attribute値に対応し、その属性に制約を作成するための適切なNSLayoutAnchorサブクラスを提供します。アンカーのメソッドを使用して、制約を作成します。