2015-07-03 4 views
0

Так что я недавно создавал то, что Apple calls a leaf-level view (кнопка), и поэтому я следил за документами от Apple, чтобы реализовать -intrinsicContentSize, и все работало (хотя код был немного странным - у меня были ограничения, установленные в моем -updateConstraints метод для размещения подзонов, а также код в методе -intrinsicContentSize, чтобы рассчитать, какой должен быть общий размер, и я чувствовал, что предоставляю дублирующую информацию в систему автоотключения).Жесткие ограничения против `-intrinsicContentSize`

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

Какая реализация изменения размера контейнера на основе содержимого внутри него является правильным способом?


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


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

+0

Если у вашего представления есть подпункты, это не вид листа. –

+0

@KenThomases справедливая точка - я могу легко использовать слои (которые просто убирают нелистость из UIKit и помещают его в QuartzCore, или используют '-drawRect' для отображения моего контента), но тот вопрос, который я задаю, вызывает озабоченность ... – DanZimm

+0

@KenThomases Кроме того, для записи Apple использует пример кнопки 'button' в качестве представления на уровне листа, подразумевая, что' UIButton' - это представление уровня листа, но в документах 'UIButton' есть очевидная 'UILabel' (на самом деле' UIButtonLabel'), который используется для отображения текста (который является подвью) – DanZimm

ответ

1

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

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

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

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

+1

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

Смежные вопросы