Как работает minimumScaleFactor UILabel?

109

Я использовал minimumFontSizeраньше, но теперь эта функция устарела, и я не совсем понимаю, как minimumScaleFactorработает.

Я хочу, чтобы максимальный размер шрифта был 10, а минимальный - 7.

Как я могу уменьшить размер шрифта до 7 с коэффициентом масштабирования?

UILabel создание:

UILabel *label = [[UILabel alloc] init];
[label setTranslatesAutoresizingMaskIntoConstraints:NO];
label.text =  [labelName uppercaseString];
label.textAlignment = NSTextAlignmentCenter;
label.textColor = [UIColor whiteColor];
label.font = [UIFont fontWithName:HELVETICA_FONT_STYLE_BOLD size:9.5];
label.backgroundColor = [UIColor clearColor];
label.minimumScaleFactor = .1f;

[label addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[label(WIDTH)]"
                                                              options:0
                                                              metrics:@{@"WIDTH" : [NSNumber numberWithFloat:buttonSize.width]}
                                                                views:NSDictionaryOfVariableBindings(label)]];

[contentView addSubview:label];
Падин215
источник

Ответы:

204

Вам нужно установить label.adjustsFontSizeToFitWidth = YES;

Скотт
источник
1
Отлично, это то, чего мне не хватало в моем собственном коде. Спасибо: D
Fogmeister
14
Примечание: «В документации Apple указано, что minimumScaleFactor работает, только если numberOfLines установлено в 1. Использование 0 или чего-либо большего, чем 1, не будет работать». . Спасибо, ШонК.
samthui7,
Потрясающие! Забавно, что если вы установите minumumScaleFactor в XIB, вам не нужно устанавливать adjustsFontSizeToFitWidth, но вам нужно это сделать в коде.
Politta
104

В дополнение к тому, что говорят другие ответы, если вы поместите minSize / defaultSize (Division) в качестве значения minimumScaleFactor, оно будет таким же, как при использовании старого minimumFontSize.

Например, если вы хотите, чтобы минимальный размер шрифта был 10 при использовании размера метки по умолчанию, вы можете сделать:

[label setMinimumScaleFactor:10.0/[UIFont labelFontSize]];

(Замените [UIFont labelFontSize]размер шрифта вашего ярлыка, если он не установлен по умолчанию).

что будет таким же, как: [label setMinimumFontSize:10.0];

Jsdodgers
источник
деление следует преобразовать в CGFloat, иначе это не сработает
dwery
@dwery Выполнение 10 / labelSize может привести к усеченному целочисленному значению 0, но 10.0 или 10.f работают нормально, без явного приведения типов.
Kalle
ты прав, должно работать. Я не могу вспомнить, в каком коде у меня это не сработало, возможно, там не было буквы f или точки.
dwery
20

По документации :

Используйте это свойство, чтобы указать наименьший множитель для текущего размера шрифта, который дает приемлемый размер шрифта для использования при отображении текста метки. Если вы укажете значение 0 для этого свойства, текущий размер шрифта будет использоваться как наименьший размер шрифта.

Итак, если размер шрифта по умолчанию для вашей метки равен 10, вы указываете 0.7fкак, minimumScaleFactorи он должен делать то же самое, что minimumFontSizeи.

ковпас
источник
Я тоже так думал; но даже когда я ставлю 0.1f, размер текста не меняется. я добавлю код uilabel.
Padin215 01
Что, если вы удалите ограничения и просто уменьшите рамку этикетки?
kovpas 01
9
Log139: Какое значение у вас установлено на numberOfLines? В документации Apple говорится, что minimumScaleFactor работает, только если numberOfLines установлено в 1. Использование 0 или чего-либо большего, чем 1, не будет работать.
SeanK 02
1
@SeanK: Он будет работать, даже если numberOfLines установлено больше 1, но НЕ 0.
Асадулла Али
12

В дополнение к другим ответам я собираюсь добавить объяснение для начинающих, которое помогло мне:

Как рассчитать minimumScaleFactor? Разделите минимальный размер шрифта ярлыка на размер шрифта ярлыка по умолчанию. Например, ваш размер шрифта по умолчанию - 25. Минимальный размер шрифта - 10.

10/25 = 0,4

0,4 - ваше minimumScaleFactorзначение. Также см. Ответ @ Jsdodgers выше.

AVog
источник