Подтвердить что ты не робот

Межстрочный интервал для UILabel с одной строкой текста

Ожидается ли, что многострочный UILabel с пользовательским атрибутом lineSpacing включает это межстрочное расстояние, даже если текст метки помещается в одну строку?

Вот мой ярлык:

let label = UILabel()
label.numberOfLines = 4
var paragraph = NSMutableParagraphStyle()
paragraph.lineSpacing = 5
paragraph.lineBreakMode = .ByTruncatingTail
label.attributedText = NSAttributedString(string: "Some short text", attributes: [NSParagraphStyleAttributeName: paragraph])

И вот как это выложено. Обратите внимание на дополнительный интервал ниже текста.

введите описание изображения здесь

Для сравнения:

введите описание изображения здесь

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

введите описание изображения здесь

Есть ли способ удалить это межстрочное расстояние, когда есть одна строка текста? Или каким-то другим способом обеспечить соблюдение некоторой последовательности, чтобы я мог хотя бы объяснить это?

Обновление

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

введите описание изображения здесь введите описание изображения здесь

4b9b3361

Ответ 1

Поскольку вы сказали, что используете пользовательский шрифт, мое лучшее предположение, основанное на предыдущем опыте, заключается в том, что основная причина этой проблемы, которую вы видите, находится где-то внутри самого настраиваемого шрифта. Всякий раз, когда я получаю пользовательский шрифт клиентом, в 90% случаев, что-то "неправильно" с фактическими метриками шрифта (как интерпретируется внутренней подсистемой рендеринга внутреннего шрифта Apple, даже если это может быть правильно сделано где-то в другом месте).

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

Как говорится, это некоторые ресурсы для вопросов, которые я поддерживаю для этого точного сценария, когда я начинаю новый проект:

Вот аналогичный вопрос для вас с предположением, что это проблема с шрифтом: "Сдвиг пользовательской UIFont". Этот вопрос касается этой проблемы в UIButton "пользовательское вертикальное выравнивание шрифта UIButton", но оба этих вопроса попадают в ответ на этот вопрос "Пользовательский установленный шрифт не отображается корректно в UILabel.

У меня есть персональное тестовое приложение для пользовательских шрифтов, которое я использую всякий раз, когда мне впервые предоставляется специальный шрифт. Это позволяет мне тестировать шрифт изолированно для каждой итерации перестроения, чтобы убедиться, что он отлично рендеринга. Обязательно проверяйте свои изменения в разных размерах шрифта и даже на дополнительных языках (да, много перестановок). У меня были проблемы с тайским и китайским языками при использовании пользовательских шрифтов, так как их восходящие линии простираются очень близко к краю ограничительной рамки для UILabel. Тестирование, которое я создал для себя, включает в себя шрифт, отображаемый в базовых UILabels различных размеров и различных языков разных размеров (поскольку, как я уже сказал, у меня был плохой опыт в прошлом с пользовательскими шрифтами на определенных языках, которые отлично отображались в римских символах).

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

Ответ 2

Вы можете рассчитать количество строк и установить lineSpacing на 0, если есть только одна строка.

Но может быть лучшее решение.

Ответ 3

paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping 

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

явно установить шрифт с помощью fontName [UIFont fontWithName:@"PingFangSC-Regular" size:14], вместо использования [UIFont systemFontOfSize:14] можно избежать проблемы, когда текст является отдельной строкой.

Надеюсь, это поможет вам!

Ответ 4

Это деф. проблема для UILabel. Это происходит как для пользовательских, так и для системных шрифтов.

Если вы можете использовать UITextView, пойти с этим. UITextView не имеет проблем с однострочным или многострочным межстрочным интервалом и работает правильно (одна строка = без межстрочного интервала).
Таким образом, вы также можете избежать создания пользовательского счетчика строк func/ext.

Ответ 5

Да, lineSpacing применяется независимо от количества строк в метке. Если вы используете автозапуск, вы можете обойти это, ограничив ваш ярлык baseline его родительскими или родственными представлениями (по мере необходимости), вместо верхнего края ярлыка, выровненного с родительским или старшим словом. (Предполагается, однако, что цвет фона вашего ярлыка совпадает с цветом его родительского представления, в противном случае вы увидите, что дополнительный интервал между строками отображается в фоновом цвете.

Еще одна вещь, которую вы можете сделать (и это, вероятно, предпочтительнее, теперь, когда я думаю об этом) заключается в установке атрибута paragraphSpacing 0. Это должно отрицать lineSpacing для последней строки на метке, независимо от того, сколько строк у вас есть.