Межстрочный интервал для 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])
И вот как это выложено. Обратите внимание на дополнительный интервал ниже текста.
![введите описание изображения здесь]()
Для сравнения:
![введите описание изображения здесь]()
Какая странность - отсутствие последовательности. Когда метка распространяется на вторую строку, нижняя строка больше не включает в себя этот дополнительный интервал:
![введите описание изображения здесь]()
Есть ли способ удалить это межстрочное расстояние, когда есть одна строка текста? Или каким-то другим способом обеспечить соблюдение некоторой последовательности, чтобы я мог хотя бы объяснить это?
Обновление
Расчет базовой линии также кажется нарушенным. При попытке выровнять представление (здесь, красное окно) с базой данных метки, многострочные метки частично покрыты.
![введите описание изображения здесь]()
Ответы
Ответ 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
для последней строки на метке, независимо от того, сколько строк у вас есть.