Следующий вопрос - это некоторое продолжение этого:
iOS: многострочный UILabel в автоматическом макете
Основная идея заключается в том, что каждый вид должен указывать его "предпочтительный" (внутренний) размер, чтобы AutoLayout мог знать, как правильно отображать его. UILabel - это всего лишь пример ситуации, когда представление не может самостоятельно знать, какой размер ему нужен для отображения. Это зависит от того, какая ширина предоставляется.
Как отмечалось в mwhuss, setPreferredMaxLayoutWidth сделал трюк, чтобы сделать ярлык на несколько строк. Но здесь не главный вопрос. Вопрос в том, где и когда я получаю это значение ширины, которое я отправляю в качестве аргумента для setPreferredMaxLayoutWidth.
Мне удалось сделать что-то, что выглядит законным, поэтому исправьте меня, если я ошибаюсь, и скажите, пожалуйста, если вы знаете лучший способ.
В UIView
-(CGSize) intrinsicContentSize
Я устанавливаюPreferredMaxLayoutWidth для моих UILabels в соответствии с self.frame.width.
UIViewController-х
-(void) viewDidLayoutSubviews
- это первый метод обратного вызова, который я знаю, где субсвиды основного вида назначаются с их точными кадрами, которые они населяют на экране. Изнутри этого метода я работаю над своими подзонами, недействительными их внутренними размерами, чтобы UILabels разбивались на несколько строк на основе ширины, которая была им назначена.