Настройка layoutMargins UIView не работает

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

Ответ 1

Пользовательские макеты не работают над представлением, являющимся корнем для экземпляра UIViewController. Они определяются системой и не могут быть переопределены. Вам нужно добавить еще один подзаголовок, который будет содержать весь ваш контент, затем вы можете изменить поля макета на этом новом "contentView"

Update:

Обсуждение

Используйте это свойство, чтобы указать желаемое количество пространства (измеренное в точках) между краем обзора и любыми подзонами. Автоматическая компоновка использует ваши поля как кий для размещения контента. Для Например, если вы задаете набор горизонтальных ограничений, используя format string "| - [subview] - |", левый и правый края подвью вставляются с края надзора соответствующей компоновкой поля. Когда край вашего вида близок к краю супервизия и свойство preserveSuperviewLayoutMargins - ДА, фактические размеры макета могут быть увеличены, чтобы предотвратить перекрывая поля надписи.

Поля по умолчанию - восемь точек с каждой стороны.

Если представление является корневым представлением контроллеров вида, система устанавливает и управляет полями. Верхнее и нижнее поля установлены на ноль точки. Боковые поля меняются в зависимости от текущего класса размера, но может быть 16 или 20 пунктов. Вы не можете изменить эти поля.

Ответ 2

Это было изменено для iOS 11. Пользовательские поля, кажется, работают очень хорошо, когда у вас установлена ​​целевая установка развертывания для этой версии iOS. Однажды мы будем смеяться над тем, что мы испытали раньше.

Если вы хотите установить значения ниже минимального уровня (который может зависеть от устройства), вы также должны установить viewRespectsSystemMinimumLayoutMargins для false (по умолчанию это значение true).

Если вы настроите таргетинг на iOS 10 и ниже, вам не повезло, ответ @Reverend правильный - настройки макета макета для представления корневого представления viewcontroller.