Центрирование Просмотр между соседями с использованием автоматического отключения в IOS

Я пытаюсь компоновать дизайн экрана с использованием ограничений (авто-макет) из конструктора интерфейса и надеяться избежать ограничений кодирования, но я бы принял ответ для любого случая, я думаю.

У меня есть два подзаголовка, содержащихся в представлении верхнего уровня. Я хочу зафиксировать вертикальное расстояние первого подсмотра до верхней части экрана (я смог это сделать - обычный вариант использования для ограничения вертикального пространства). Я хочу, чтобы второе подзадача плавало (по вертикали) в центре расстояния между нижней частью первого подсмотра и нижней частью экрана. Идея состоит в том, что дизайн немного реагирует на размеры iPhone 3.5 "vs 4".

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

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

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

Любые мысли или предложения?

Ответ 1

UPDATE

Этот ответ описывает, как это сделать в Xcode 6.0 (и, вероятно, работает в Xcode 5.0 и 5.1).

ORIGINAL

Если вы хотите сделать это с помощью автоматического макета, вам нужно добавить хотя бы один спейсер. Это не должно быть просмотр вертикально-центрированного представления (или любого другого представления), поэтому он довольно незначительно влияет на вашу иерархию представлений.

Я рекомендую не пытаться установить ограничения в Interface Builder в Xcode 4.6.3. Это просто больно. Но если вам действительно нужно, это выполнимо.

  • Создайте спейсер (простой старый UIView) с нижнего края верхнего обнимающего представления до нижнего края супервизора. Установите его в скрытое. Дайте ему ограничения на верхнее обнимающее представление, а также на левый и нижний края корневого представления и наведите его ширину. Моя ширина разделителя составляет 10:

    spacer constraints

  • Добавьте свой средний вид (здесь, кнопка). Дайте ему ограничение "Горизонтальный центр в контейнере". Затем выберите средний вид и вид спейсера и дайте им ограничение "Вертикальные центры":

    ограничения среднего вида

Обратите внимание, что если вы отбрасываете средний вид, когда IB показывает правильные рекомендации, он будет устанавливать эти ограничения для вас.

Вы можете протестировать, разрешив изменение размера для потомков (но не братьев и сестер и предков) и изменив размер корневого представления в IB. Средний вид будет оставаться центрированным между верхним обнимающим видом и нижней частью супервизора:

размер экрана 4 дюйма

короткое представление