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

Другие вопросы по тегам