Мое понимание autolayout состоит в том, что он принимает размер суперпредставления и базируется на ограничениях и внутренних размерах, которые он вычисляет позиции подпредставлений.
Есть ли способ обратить этот процесс вспять? Я хочу изменить размер суперпредставления на основе ограничений и внутренних размеров. Какой самый простой способ достичь этого?
У меня есть представление, разработанное в Xcode, для которого я использую заголовок UITableView
. Это представление включает в себя метку и кнопку. Размер этикетки различается в зависимости от данных. В зависимости от ограничений, метка успешно нажимает кнопку вниз или, если между кнопкой и нижней частью супервидения есть ограничение, метка сжимается.
Я нашел несколько похожих вопросов, но у них нет хороших и простых ответов.
Ответы:
Правильный API для использования
UIView systemLayoutSizeFittingSize:
, передавая либоUILayoutFittingCompressedSize
илиUILayoutFittingExpandedSize
.Для обычного
UIView
использования autolayout это должно работать, пока ваши ограничения верны. Если вы хотите использовать его вUITableViewCell
(например, для определения высоты строки), вы должны вызвать его напротив своей ячейкиcontentView
и взять высоту.Дополнительные соображения существуют, если у вас есть один или несколько UILabel по вашему мнению, которые являются многострочными. Для них не обязательно, чтобы
preferredMaxLayoutWidth
свойство было установлено правильно, чтобы метка предоставляла правильное значениеintrinsicContentSize
, которое будет использоваться приsystemLayoutSizeFittingSize's
расчете.РЕДАКТИРОВАТЬ: по запросу, добавив пример расчета высоты для ячейки табличного представления
Использование autolayout для расчета высоты ячейки таблицы не очень эффективно, но, безусловно, удобно, особенно если у вас есть ячейка со сложным макетом.
Как я уже говорил выше, если вы используете мультилинию
UILabel
, обязательно синхронизируйте ееpreferredMaxLayoutWidth
с шириной метки. Я использую пользовательскийUILabel
подкласс для этого:Вот надуманный подкласс UITableViewController, демонстрирующий heightForRowAtIndexPath:
Простая пользовательская ячейка:
И вот картина ограничений, определенных в раскадровке. Обратите внимание, что на метке нет ограничений по высоте / ширине - они выведены из меток
intrinsicContentSize
:источник
sizingCell
или егоcontentView
.sizingCell
ширина соответствует вашейtableView
ширине.Комментарий Эрика Бейкера подсказал мне основную идею о том, что для того, чтобы размер представления был определен содержимым, помещенным в него, размещенный в нем контент должен иметь явную связь с содержащим представлением, чтобы повысить его высоту. (или ширина) динамически . «Добавить подпредставление» не создает эти отношения, как вы могли бы предположить. Вы должны выбрать, какое подпредставление будет определять высоту и / или ширину контейнера ... чаще всего любой элемент пользовательского интерфейса, который вы поместили в нижнем правом углу вашего общего пользовательского интерфейса. Вот некоторый код и встроенные комментарии, чтобы проиллюстрировать это.
Обратите внимание, что это может представлять особую ценность для тех, кто работает с представлениями прокрутки, поскольку принято проектировать вокруг одного представления содержимого, которое определяет его размер (и передает это представлению прокрутки) динамически на основе того, что вы в него вставили. Удачи, надеюсь, это поможет кому-то там.
источник
Вы можете сделать это, создав ограничение и подключив его через конструктор интерфейса
См. Объяснение: Auto_Layout_Constraints_in_Interface_Builder
raywenderlich начало авто-макета
AutolayoutPG Статьи ограничение Основы
соедините этот выход Constraint с вашими подчиненными представлениями Constraint или также подключите суперпросмотры Constraint и настройте их в соответствии с вашими требованиями следующим образом
Я надеюсь, что это проясняет это.
источник
Это может быть сделано для нормального
subview
внутри большегоUIView
, но это не работает автоматическиheaderViews
. ВысотаheaderView
определяется тем , что возвращенноеtableView:heightForHeaderInSection:
поэтому вы должны рассчитатьheight
на основеheight
изUILabel
плюс пространства дляUIButton
и любыхpadding
вам нужно. Вам нужно сделать что-то вроде этого:Вот
headerString
любая строка, которую вы хотите заполнитьUILabel
, а число 281 - этоwidth
изUILabel
(как в настройкеInterface Builder
)источник