UILabel неправильно переносит слова в iOS 11
У меня проблема с приложением с использованием XIB без автозапуска. Я не знаю, важна ли эта информация.
У меня есть UILabel с 2 строками, используя перенос слов. В iOS 10 обертка слов работала правильно, а первая строка содержала одно слово + специальный символ, например амперсанд. Пример:
![UiLabel on ios 10]()
Затем на iOS 11 перенос слов работает как-то неправильно и помещает ampresand во вторую строку:
![UiLabel on ios 11]()
Это проблематично, поскольку более длинные слова, которые обычно установлены на второй строке, теперь отображаются неправильно. Любая идея, что изменилось? Я знаю о safeArea, но это не похоже на причину. Любые идеи о том, как перенести этот амперсанд на вершину, где для этого достаточно места?
Остальные настройки: ![инспектор размера]()
Ответы
Ответ 1
Возможно, это может быть преднамеренное изменение Apple для предотвращения вдовствующих строк. С точки зрения дизайна, предпочтительно избегать наличия единственного слова в строке текста. Таким образом, кажется, что UILabel теперь разрывает линию таким образом, что строка текста всегда содержит по меньшей мере 2 слова.
Удивительно, что нет никакой документации или способа отключить это поведение.
![введите описание изображения здесь]()
Также здесь хорошая статья о "овдовевшем" и "потерянном тексте".
Ответ 2
На самом деле это не ответ, но я хочу добавить иллюстрацию того, как это общая проблема, а вовсе не связанная с амперсандами.
![два UILabels]()
Оба эти UILabels имеют одинаковые ограничения ширины, и текст почти идентичен. Но второй имеет слово wrap, которого я ожидал бы. Первое неверно, "about" может явно оставаться на первой строке.
Ответ 3
Кажется, что замена пространства перед амперсандом с неразрывным пространством (U + 00A0) удерживает амперсанд в одной строке. В зависимости от того, как вы генерируете текст для метки, это может быть нелегко автоматизировать (возможно, вам действительно нужен амперсанд, который будет во второй строке в некоторых случаях).