iOS Prevent UILabel "трясется" при изменении чисел
У меня есть UILabel
который показывает вывод таймера в формате MM:ss:SS
(минуты, секунды, центсекунды), однако он "трясется" слева направо при изменении ширины центсекунд - например, "11" уже, чем "33".
Есть ли способ, которым я могу смягчить это? Я попытался отцентрировать его, придав ему фиксированную ширину, но они, похоже, не помогли.
3 ответа
Начиная с iOS 9.0, системный шрифт использует пропорциональные цифры. Если вы хотите одноразрядные цифры, есть вариант шрифта, который вы можете получить, используя +[UIFont monospacedDigitSystemFontOfSize:weight:]
, Это работает только для системного шрифта.
Если вы хотите работать с другим шрифтом, попробуйте запросить одноразмерный вариант, но его может не быть. Учитывая UIFont
Вы можете запросить ее fontDescriptor
затем попросите аналогичный дескриптор шрифта, который моноширинный (не только для цифр), используя -[UIFontDescriptor fontDescriptorWithSymbolicTraits:]
а также UIFontDescriptorTraitMonoSpace
, Затем вы можете создать новый шрифт, передав новый дескриптор шрифта +[UIFont fontWithDescriptor:size:]
,
Тем не менее, я сомневаюсь, что есть моно-вариант Impact. Это не подходит для ваших целей.
У меня такая же проблема. @KenThomases ответ работает. Вот версия Swift:
// replace whatever font your using with this font instead to stop the shaking
UIFont.monospacedDigitSystemFont(ofSize: 19, weight: UIFont.Weight.regular)
то есть:
yourLabel.font = UIFont.monospacedDigitSystemFont(ofSize: 19, weight: UIFont.Weight.regular)
К вашему сведению есть другие UIFont.Weight
вес:
.black
, .bold
, .heavy
, .light
, .medium
, .regular
, .semibold
, .thin
, .ultraLight
В соответствии с этим другим ответом приведенные ниже шрифты являются системными шрифтами, которые также являются моноширинными, поэтому они также не будут дрожать:
курьер
Courier-Bold
Courier-BoldOblique
Courier-Oblique
CourierNewPS-BoldItalicMT
CourierNewPS-BoldMT
CourierNewPS-ItalicMT
CourierNewPSMT
Менло-Bold
Менло-BoldItalic
Менло-Italic
Менло-Regular
то есть:
// no shaking
yourLabel.font = UIFont(name: "Menlo-Regular", size: 19)
Если вы используете только числовые цифры, то HelveticaNeue также моноширинный и не трясется, но сомнительный. Прочитайте комментарии ниже этого ответа, прежде чем использовать этот шрифт.
то есть:
// no shaking but apparently you can only use numbers not letters
yourLabel.font = UIFont(name: "HelveticaNeue", size: 19)
Используйте моноширинный шрифт, также называемый шрифтом с фиксированным шагом, с фиксированной шириной или непропорциональным шрифтом. Это шрифт, буквы и символы которого занимают одинаковое количество горизонтального пространства. Примеры моноширинных шрифтов включают Courier, Courier New, Lucida Console, Monaco и Consolas