NSLayoutConstraint — я хочу создать боковые поля

У меня есть представление, которое находится в контейнере

введите здесь описание изображения

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

но я не знаю, как добавить их в контейнер.

Я имею в виду, что не знаю, как определить NSLayoutConstraint, чтобы делать то, что я хочу.

Мне нужны боковые поля по 20 пунктов с каждой стороны, слева и справа от контейнера, в отношении его супервизора.


person Lena Bru    schedule 24.03.2014    source источник


Ответы (2)


Это должно выглядеть примерно так:

// Get  view and bind that
UIView * view = childViewController.view;
NSDictionary *views = NSDictionaryOfVariableBindings(view); // @"view" : view
// add constraint to view with margins - -value- to supertview - | in horizontal axis
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20.0-[view]-20.0-|" options:0 metrics:metrics views:views]];
// The same for vertical axis
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20.0-[view]-20.0-|" options:0 metrics:metrics views:views]];

Кроме того, взгляните на это руководство: http://commandshift.co.uk/blog/2013/01/31/visual-format-language-for-autolayout/ . Это выглядит мило.

Удачи!

person Ossir    schedule 24.03.2014
comment
к сожалению, это тоже не сработало, так как я работаю с контейнерами, мне непонятно, куда я должен добавить этот код, чтобы убедиться, что он не падает на то, что у childViewController.view нет супервью на viewdidload - person Lena Bru; 24.03.2014
comment
Зачем вам viewDidLoad? Чтобы показать вам дочерний контроллер представления, вам нужно где-то addSubview:(или insertSubview) childViewController.view, чтобы вы могли выполнить этот код сразу после addSubview: - person Ossir; 24.03.2014

Вы можете решить эту проблему с помощью более интуитивно понятного кода, чем официальный API (визуальный формат которого проще всего понять, но все же не очень интуитивный ИМХО).

Если вы используете стороннюю категорию, например https://github.com/jrturton/UIView-Autolayout (что я рекомендую вам сделать), это решается с помощью такого небольшого кода:

[yourView pinToSuperviewEdges:JRTViewPinLeftEdge|JRTViewPinRightEdge inset:20.0];

ОБНОВЛЕНИЕ

Поскольку в вашем комментарии говорится, что правый край не работает, вы можете попробовать установить ограничения края индивидуально для его отладки, например:

[yourView pinEdge:NSLayoutAttributeLeft toEdge:NSLayoutAttributeLeft ofView:yourSuperView inset:20];
[yourView pinEdge:NSLayoutAttributeRight toEdge:NSLayoutAttributeRight ofView:yourSuperView inset:40];

Измените вставку вокруг второго ограничения, чтобы увидеть, правильно ли вы все поняли. Если он внезапно выглядит правильно со вставкой 50, вы знаете, что суперпредставление слишком широкое (в данном случае на 30 пикселей).

person Marius Waldal    schedule 24.03.2014
comment
левый край, кажется, работает, но правый край обрезает представления, что мне нужно сделать, чтобы исправить это? - person Lena Bru; 24.03.2014
comment
Добавлен пример их настройки по отдельности, чтобы можно было попытаться отладить, что не так с вставкой правого края. - person Marius Waldal; 24.03.2014
comment
Что такое супер вид и каков его размер? - person Marius Waldal; 24.03.2014