UIViewController
とUIView
およびUITableView
UIView
|-UITableView
私はこのようにマージンを設定しようとしています:
- (void)viewDidLoad {
[super viewDidLoad];
self.view.layoutMargins = UIEdgeInsetsMake(30, 30, 30, 30);
self.tableView.preservesSuperviewLayoutMargins = YES;
[self.view layoutIfNeeded];
}
しかし、ビューでは何も起こりません。
InterfaceBuilderからの制約は次のとおりです
(lldb) po self.view.constraints
<__NSArrayM 0x786ab6e0>(
<NSLayoutConstraint:0x7896e940 UIView:0x7896e470.trailingMargin == UITableView:0x79b51a00.trailing - 16>,
<NSLayoutConstraint:0x7896e970 UITableView:0x79b51a00.leading == UIView:0x7896e470.leadingMargin - 16>,
<NSLayoutConstraint:0x7896e9a0 V:[_UILayoutGuide:0x7896e510]-(0)-[UITableView:0x79b51a00]>,
<NSLayoutConstraint:0x7896e9d0 V:[UITableView:0x79b51a00]-(0)-[_UILayoutGuide:0x7896e600]>,
<_UILayoutSupportConstraint:0x7896c7d0 V:[_UILayoutGuide:0x7896e510(0)]>,
<_UILayoutSupportConstraint:0x7896c2b0 V:|-(0)-[_UILayoutGuide:0x7896e510] (Names: '|':UIView:0x7896e470 )>,
<_UILayoutSupportConstraint:0x7896cbf0 V:[_UILayoutGuide:0x7896e600(0)]>,
<_UILayoutSupportConstraint:0x7896ea00 _UILayoutGuide:0x7896e600.bottom == UIView:0x7896e470.bottom>
)
その結果、マージンは表示されず、何も変更されません。
iOS 8
カスタムlayoutMarginsは、UIViewControllerインスタンスのルートであるビューでは機能しません。これらはシステムによって定義され、上書きできません。すべてのコンテンツを保持する別のサブビューを追加する必要があります。その後、この新しい「contentView」のレイアウトマージンを変更できます
更新:
ディスカッション
このプロパティを使用して、ビューのエッジとサブビューの間のスペースの望ましい量(ポイントで測定)を指定します。自動レイアウトでは、コンテンツを配置するための手掛かりとしてマージンを使用します。たとえば、フォーマット文字列「|-[subview]-|」を使用して水平方向の制約のセットを指定した場合、サブビューの左端と右端は、対応するレイアウトマージンによってスーパービューの端から挿入されます。ビューのエッジがスーパービューのエッジに近く、preservesSuperviewLayoutMarginsプロパティがYESの場合、コンテンツがスーパービューのマージンと重ならないように実際のレイアウトのマージンを増やすことができます。
デフォルトのマージンは、両側で8ポイントです。
ビューがビューコントローラのルートビューの場合、システムがマージンを設定および管理します。上部と下部のマージンはゼロ点に設定されています。サイドマージンは、現在のサイズクラスによって異なりますが、16ポイントまたは20ポイントにすることができます。これらのマージンは変更できません。
これはiOS 11
で変更されました。このiOSバージョンのデプロイメントターゲットをセットアップすると、カスタムマージンが非常にうまく機能するようです。ある日、以前に経験したことを笑います。
システムの最小値(デバイスによって異なる場合があります)よりも低い値を設定する場合は、viewRespectsSystemMinimumLayoutMargins
もfalseに設定する必要があります(デフォルトではtrueです)。
iOS 10
をターゲットにしていて、それよりも低い場合は、@ Reverendの答えは正しいです-ビューコントローラーのルートビューのレイアウトマージンのカスタマイズはありません。