Использование ограничений для сохранения двух табличных представлений одинаковой высоты и одинакового расстояния друг от друга

Контекст/Что я хотел бы сделать

  • Я создаю это для iOS 7
  • Я использую раскадровку
  • У меня есть два UITableViews, которые я хотел бы сохранить на одинаковой высоте и расстоянии друг от друга, чтобы сохранить визуальное соответствие между 3,5 и 4-дюймовыми устройствами.
  • Итак, при переходе с 4-дюймового экрана на 3,5-дюймовый экран я бы хотел:
  • Представления таблицы становятся короче, но остаются одинаковыми по высоте
  • Чтобы верхний вид таблицы сохранял ту же позицию y
  • Чтобы нижний вид таблицы сместил свою позицию y вверх, чтобы сохранить одинаковое расстояние между нижней частью верхнего представления таблицы и верхней частью нижнего представления таблицы. АКА тот же разрыв между ними

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

Что я пробовал

  • Используя значок булавки в раскадровке, я выбрал оба TableView и установил их высоту равной и включил этот код в контроллер представления:

[self.topTableView addConstraint: [NSLayoutConstraint ограничениеWithItem: атрибут self.bottomTableView: NSLayoutAttributeBottom relatedBy: 0 toItem: атрибут self.bottomTableView: множитель NSLayoutAttributeTop: 1 константа: 30]];

Вопрос

  • Как мне сохранить их одинаковую высоту, сохраняя при этом одинаковое расстояние?

Обновить

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


person drc    schedule 01.10.2013    source источник
comment
Итак, что вы хотите изменить при изменении размера экрана? Что-то должно быть другим. Вы хотите, чтобы табличные представления были короче (но одинаковой высоты) на более коротком экране?   -  person rdelmar    schedule 01.10.2013
comment
Да правильно - короче, но равны по высоте. & для представления верхней таблицы, чтобы сохранить свое положение y, и представления нижней таблицы, чтобы сместиться вверх, чтобы сохранить одинаковое расстояние между двумя представлениями таблицы.   -  person drc    schedule 01.10.2013
comment
Пожалуйста, отметьте один из этих ответов как принятый.   -  person jemmons    schedule 10.02.2014


Ответы (2)


Ознакомьтесь с предложенным Apple способом сделать это (это в разделе "Создание равного интервала между представлениями").

Изменить. Теперь Apple предпочитает использовать для этой цели представления стека. См. это видео WWDC 2013 для OS X и это приложение для iOS с WWDC 2015

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

Причина этого кроется в том, как работает система ограничений. Отношения ограничения всегда строго между двумя объектами. В ограничении интервала это отношение должно быть между объектом, который находится в интервале, и объектом, от которого он находится на расстоянии X. Вот и все. Нет места для третьего отношения, чтобы сделать пространство (само по себе результатом отношения) равным какому-то другому значению.

С другой стороны, ограничения по высоте (и ширине) не являются отношениями. Вы можете установить высоту вещи с помощью простой константы, которая не связана ни с чем другим. Таким образом, есть «место» для указания отношения к другому объекту — например, высота должна быть равна другой высоте (или ширине, или чему-то еще).

Поэтому, если вы когда-нибудь обнаружите, что вам нужны ограничения, которые каким-то образом связаны друг с другом, обратите внимание на высоту и ширину, а не на пробелы. В вашем конкретном примере вы можете окружить свои UITableView скрытыми UIView, установить их высоты равными, а их пространство для соседей/контейнеров равным 0 или какой-либо другой низкой константе.

В качестве дополнительного бонуса все это возможно в IB. Нет необходимости в пользовательском коде или подклассах.

person jemmons    schedule 19.01.2014

Верхнее представление таблицы должно иметь ограничение на верхнюю часть суперпредставления (или ограничение верхнего макета), ограничение вертикального интервала на нижнее представление таблицы и ограничение по высоте. Нижнее табличное представление должно иметь ограничение на нижнюю часть суперпредставления и такое же ограничение по высоте, что и верхнее табличное представление. Главное, что вам нужно, это сделать приоритет ограничения высоты верхнего табличного представления менее 1000, чтобы при изменении высоты экрана единственное, что не является обязательным (это ограничение высоты ‹1000), было бы вещь, которая настраивается. Все это можно настроить в IB.

После редактирования:

На самом деле вам вообще не нужно ограничение по высоте для верхнего представления таблицы. Поскольку у меня есть ограничения для верхней и нижней части суперпредставления, а также одно между двумя табличными представлениями, все, что вам нужно, это ограничение, которое делает высоты табличных представлений равными.

person rdelmar    schedule 01.10.2013
comment
Спасибо! Пробуем сейчас - person drc; 01.10.2013
comment
Кажется, это не работает для меня. Должен ли я отправить вам файл? - person drc; 01.10.2013
comment
@drc, что не работает? Что оно делает? Я проверил это, и это сработало отлично для меня. - person rdelmar; 01.10.2013
comment
Разрыв между двумя представлениями таблицы увеличивается, когда я перехожу к 3,5-дюймовому экрану. - person drc; 01.10.2013
comment
@drc, то у вас либо нет ограничения по вертикали между двумя представлениями таблицы, либо у вас есть какое-то другое ограничение, которое ему мешает. Вы получаете сообщения об ошибках? - person rdelmar; 01.10.2013
comment
@drc, посмотри мою правку, она даже проще, чем я думал изначально. - person rdelmar; 01.10.2013
comment
Мое дополнительное изображение в вопросе вообще помогло? - person drc; 01.10.2013
comment
кажется, что если я смоделировал метрики для верхней панели, установив полупрозрачную панель навигации, это все испортит, но если я не установил ничего, это работает? - person drc; 02.10.2013
comment
эй, я все еще борюсь с этим - есть идеи? - person drc; 03.10.2013