Отрегулируйте размер шрифта UIButton по ширине
У меня есть следующий код:
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0, 0.0, 25, 25);
[[button layer] setCornerRadius:5.0f];
[[button layer] setMasksToBounds:YES];
[[button layer] setBackgroundColor:[[UIColor redColor] CGColor]];
[button.titleLabel setFrame:CGRectMake(0,0, 25, 25)];
[button setTitle:[NSString stringWithFormat:@"%@", [[topics objectAtIndex:indexPath.row] unread]] forState:UIControlStateNormal];
Проблема в том, что когда строка в тексте не длинная, она отображается нормально (1-2 цифры). Однако, когда он довольно длинный (3++ цифра), все, что я вижу, - это красная кнопка без текста внутри. Как мне это отрегулировать?
Я не думаю, что:
[button.titleLabel setAdjustsFontSizeToFitWidth:YES];
выполняет работу, верно?
Ответы
Ответ 1
Попробуйте следующее:
button.titleLabel.numberOfLines = 1;
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.lineBreakMode = NSLineBreakByClipping; //<-- MAGIC LINE
Я не уверен, почему это делает трюк, но он делает:)
Ответ 2
button.titleLabel.adjustsFontSizeToFitWidth = YES;
должен выполнять свою работу , если вы используете Auto-Layout, и установили ограничение на ширину кнопки.
Другие параметры (минимальный масштабный коэффициент, количество строк и т.д.) все еще можно использовать для дальнейшей настройки в соответствии с вашими потребностями, но не требуются.
Ответ 3
Ответ от EliBud не работает на iOS 8.
Я нашел решение, которое работает на iOS 8.
Ниже приведен быстрый код:
let label = self.button?.titleLabel
label?.minimumScaleFactor = 0.01
label?.adjustsFontSizeToFitWidth = true
label?.font = UIFont.systemFontOfSize(100)
Вы можете играть с меткой?.lineBreakMode, поскольку я обнаружил, что результаты варьируются для разных режимов разрыва.
Ответ 4
В последнем быстром это, похоже, работает для меня
button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping
Ответ 5
adjustsFontSizeToFitWidth
не работал у меня, пока я не установил ограничение ширины на моей кнопке в Interface Builder.
Установка ограничения удерживала кнопку от увеличения размера и, следовательно, не понимала, что ей пришлось сжимать текст.
Ответ 6
iOS 10.3 на основе других ответов здесь:
button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.baselineAdjustment = .alignCenters
Никто еще не упомянул baselineAdjustment
; Мне это нужно, потому что ярлык кнопки становится вертикально неровным после того, как adjustsFontSizeToFitWidth
вступает в силу. Документация Apple baselineAdjustment
:
Если для свойства adjustsFontSizeToFitWidth
установлено значение true
, это свойство управляет поведением исходных текстов текста в ситуациях где требуется настройка размера шрифта. Значение по умолчанию это свойство alignBaselines
. Это свойство действует только тогда, когда для свойства numberOfLines
установлено значение 1
.
FWIW, я никогда не смог бы выровнять ярлык.
Ответ 7
Расширение Swift 4
extension UIButton {
@IBInspectable var adjustFontSizeToWidth: Bool {
get {
return self.titleLabel?.adjustsFontSizeToFitWidth
}
set {
self.titleLabel?.numberOfLines = 1
self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
self.titleLabel?.lineBreakMode = .byClipping;
self.titleLabel?.baselineAdjustment = .alignCenters
}
}
}
![enter image description here]()
Ответ 8
Решение Xamarin.iOS
var accountButton = new UIButton();
accountButton.SetTitle("Account", UIControlState.Normal);
accountButton.TitleLabel.AdjustsFontSizeToFitWidth = true;
accountButton.TitleLabel.Lines = 1;
accountButton.TitleLabel.LineBreakMode = UILineBreakMode.Clip;
accountButton.TitleLabel.Font = accountButton.TitleLabel.Font.WithSize(35);
В конце концов я установил размер шрифта, чтобы шрифт был "большим", прежде чем система будет подстраивать размер к размеру.
Ответ 9
на основании ответа Nik Kov:
import UIKit
extension UIButton {
@IBInspectable var adjustFontSizeToWidth: Bool {
get {
return titleLabel!.adjustsFontSizeToFitWidth
}
set {
titleLabel!.adjustsFontSizeToFitWidth = newValue
titleLabel!.lineBreakMode = .byClipping
}
}
}
Ответ 10
Ниже решение сработало для меня:
button.titleLabel?.adjustsFontForContentSizeCategory = true
Документация разработчика объясняет это свойство как:
Булево значение, указывающее, обновляется ли объект автоматически его шрифт при изменении категории размера содержимого устройства.
Ответ 11
В iOS 13.1 с Swift 5 мне пришлось предоставить contentEdgeInsets
также для настройки отступов.
extension UIButton {
@IBInspectable var adjustFontSizeToWidth: Bool {
get {
return self.titleLabel?.adjustsFontSizeToFitWidth ?? false
}
set {
self.titleLabel?.numberOfLines = 1
self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
self.titleLabel?.lineBreakMode = .byClipping;
self.titleLabel?.baselineAdjustment = .alignCenters
self.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
}
}
}