Вопреки другим ответам, я думаю, вы должны хотя бы рассмотреть систему автоматического макета. Он был создан, чтобы упростить создание предсказуемых макетов, подобных тому, который вы описали. Автоопределение управляется ограничениями, которые вы накладываете на представления в макете. Вы можете создавать эти ограничения визуально или программно. Визуально ваш первый взгляд будет выглядеть примерно так:
![visual constraints](https://i.stack.imgur.com/6xQ2h.png)
Синие линии, которые вы видите, есть ряд ограничений, которые определяют расстояние между кнопками, пространство вокруг кнопок, а также высоты и ширины кнопок. Вы можете увидеть пару ограничений, на которых есть =
- я выбрал все три кнопки и дал им ограничение «равной высоты».
Есть хороший visual format syntax, который позволяет описывать ограничения как строки. Потратьте минутку, чтобы посмотреть на связанный документ - вам не потребуется намного больше времени, чтобы узнать, что вы можете читать строки. Например, ваш лучший макет может быть определен следующим образом:
V:[button1]-[button2(==button1)]-[button3(==button1)]
в скобки ==button1
говорит системе компоновки, чтобы сделать button2
и button3
такой же высоты, как button1
. -
указывает, что между кнопками должен использоваться стандартный интервал; вы можете указать другой интервал, если хотите. Для 10 расстояния между точками, сделайте следующее:
V:|-10-[button1]-10-[button2(==button1)]-10-[button3(==button1)]-10-|
После того, как у вас есть такие строки, вы можете превратить его в ограничение с помощью метода: +[NSLayoutConstraint constraintsWithVisualFormat:options:metrics:views:]
Некоторых ограничений не могут быть заданы либо визуально, либо с описанных выше. Главными среди них являются те, где вы хотите установить постоянную (но неравную) взаимосвязь между двумя представлениями, как с вашими верхними и нижними макетами. Вы хотите, чтобы один из них занимал 40% доступного вертикального пространства, а другой - 60%. Сделайте это, используя метод: +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]
. Например:
NSLayoutConstraint *c = [NSLayoutConstraint constraintWithItem:bottomView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:topView
multiplier:1.5
constant:0];
Это дает ограничение, которое устанавливает высоту bottomView
в 1,5 раза высота topView
(что вы хотите, так как 60/40 = 1.5).
Если вы создаете ограничения программно, вы можете добавить их в соответствующее представление при создании (или загрузке) иерархии представлений. Метод -viewDidLoad
контроллера вашего вида - прекрасное место для этого.
Вы используете автоматическую компоновку в IB? Или вы, возможно, знаете о Спрингсе и Струте? –
Я не слышал о «Спрингсе и Стратах». Не могли бы вы реализовать это с помощью конструктора интерфейса? – EGHDK
http://disanji.net/iOS_Doc/#documentation/DeveloperTools/Conceptual/IB_UserGuide/Layout/Layout.html –