Что такое intrinsic content size в iOS
Что проверяют
Понимаете ли вы, откуда компоновщик берёт размеры, когда явных ограничений нет, и владеете ли приоритетами. Это отличает того, кто расставляет ограничения наугад, пока не пропадут красные линии, от того, кто описывает намерение и получает предсказуемый макет.
Как отвечать
Собственный размер содержимого это размер, который вью сообщает движку компоновки, исходя из своего наполнения: текст надписи, картинка, отступы кнопки. Движок превращает его в неявные ограничения по каждой оси. Насколько они сильные, задают два приоритета: прижатие к содержимому не даёт вью стать шире наполнения, сопротивление сжатию не даёт обрезать его.
Для своей вью размер объявляется явно, и его обязательно сбрасывать при смене содержимого:
override var intrinsicContentSize: CGSize {
CGSize(width: UIView.noIntrinsicMetric, height: 44)
}Отдельно проговорите многострочный текст. У надписи с неограниченным числом строк высота зависит от доступной ширины, поэтому ширину задают ограничениями или предпочтительной максимальной шириной, иначе высота считается по одной строке. На этом же держится авторазмер ячеек списка.
Где спотыкаются
Называют этот размер минимальным. Он предпочтительный: вью можно и сжать, и растянуть, вопрос лишь в приоритетах. Без этого невозможно объяснить, почему из двух надписей в строке растягивается именно одна, а вторая держит свой текст.
Переопределяют размер и не сообщают о его изменении. Пересчёт не запускается сам от смены текста или картинки, вью остаётся прежней до следующей полной перекладки, и баг выглядит как «обновляется через раз».
Ждут собственного размера там, где его нет. Пустая вью и картинка без изображения не сообщают ничего, компоновка становится неоднозначной, и вместо явных ограничений начинают перебирать приоритеты. Похожая история внутри прокрутки: её содержимое считается по ограничениям вложенных вью, и размер сам собой оттуда не берётся.