Я создал образец проекта, чтобы воспроизвести это.
У меня есть xib файл с UILabel с фиксированным верхним, ведущим и конечным ограничениями. Я добавил ограничение minHeight и установил количество строк в 0.
Я устанавливаю для preferredMaxLayoutWidth значение Automatic (проверяется в файле xib).
В viewDidLoad у меня есть это:
self.myLabel.layer.borderColor = [[UIColor redColor] CGColor]; self.myLabel.layer.borderWidth = 2.0f;
self.myLabel.text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
И когда я запускаю симулятор на iPhone 6 или 6+, я получаю следующее:
Я понятия не имею, откуда идет верхнее и нижнее дополнение, и оно пропорционально количеству символов в UILabel.
Есть ли какие-то магические настройки, которые я забыл? Он отлично работает на устройствах iPhone 4.
Теперь, если я не устанавливаю предпочтительныйMaxLayoutWidth, у него нет дополнительного дополнения, но это прерывает мои многострочные строки в UILabel. Он отсекает текст. Я не использовал Size-Class.
Edit:
Таким образом, я изменил несколько вещей в своем примере проекта, чтобы соответствовать ситуации в моем реальном проекте. Я добавил tableView (с верхними, ведущими, нижними и конечными ограничениями, установленными в его родительском представлении). Каждая ячейка таблицыView имеет 4 метки. Верхняя метка имеет верхнее, ведущее и конечное ограничение для contentView ячейки, а последующие метки имеют вертикальное ограничение над надписью над ней. Каждая метка имеет набор ограничений heightGreaterThan и набор widthGreaterThan.
Это выглядит так, как если бы не выбран предпочтительный наборMaxLayoutWidth (обратите внимание, как метки ограничены до 1 строки).
С предпочтительнымMaxLayoutWidth. Теперь UILabel показывает весь контент, но имеет дополнение сверху и снизу.
Edit2: Пример проекта: https://www.dropbox.com/s/sdahx9njnsxiv98/MultiLineUILabel.zip?dl=1