web-dev-qa-db-ja.com

UIViewのlayoutMarginsの設定が機能しない

UIViewControllerUIViewおよび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

17
Marcin

カスタムlayoutMarginsは、UIViewControllerインスタンスのルートであるビューでは機能しません。これらはシステムによって定義され、上書きできません。すべてのコンテンツを保持する別のサブビューを追加する必要があります。その後、この新しい「contentView」のレイアウトマージンを変更できます

更新:

ディスカッション

このプロパティを使用して、ビューのエッジとサブビューの間のスペースの望ましい量(ポイントで測定)を指定します。自動レイアウトでは、コンテンツを配置するための手掛かりとしてマージンを使用します。たとえば、フォーマット文字列「|-[subview]-|」を使用して水平方向の制約のセットを指定した場合、サブビューの左端と右端は、対応するレイアウトマージンによってスーパービューの端から挿入されます。ビューのエッジがスーパービューのエッジに近く、preservesSuperviewLayoutMarginsプロパティがYESの場合、コンテンツがスーパービューのマージンと重ならないように実際のレイアウトのマージンを増やすことができます。

デフォルトのマージンは、両側で8ポイントです。

ビューがビューコントローラのルートビューの場合、システムがマージンを設定および管理します。上部と下部のマージンはゼロ点に設定されています。サイドマージンは、現在のサイズクラスによって異なりますが、16ポイントまたは20ポイントにすることができます。これらのマージンは変更できません。

43
the Reverend

これはiOS 11で変更されました。このiOSバージョンのデプロイメントターゲットをセットアップすると、カスタムマージンが非常にうまく機能するようです。ある日、以前に経験したことを笑います。

システムの最小値(デバイスによって異なる場合があります)よりも低い値を設定する場合は、viewRespectsSystemMinimumLayoutMarginsもfalseに設定する必要があります(デフォルトではtrueです)。

iOS 10をターゲットにしていて、それよりも低い場合は、@ Reverendの答えは正しいです-ビューコントローラーのルートビューのレイアウトマージンのカスタマイズはありません。

14
Viktor Kucera