Настройка размера шрифта 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];
выполняет работу, верно?
9 ответов:
попробуйте это:
button.titleLabel.numberOfLines = 1; button.titleLabel.adjustsFontSizeToFitWidth = YES; button.titleLabel.lineBreakMode = NSLineBreakByClipping; //<-- MAGIC LINEЯ не уверен, почему это делает трюк, но он работает :)
button.titleLabel.adjustsFontSizeToFitWidth = YES;должен делать работу самостоятельно Если вы используете Auto-Layout и установили ограничение на ширину кнопки.
остальные варианты (минимальный масштаб, количество строк и т. д.) еще могут быть использованы для дальнейшей настройки в соответствии с вашими потребностями, но не обязательно.
ответ от EliBud не работает на iOS 8. Я нашел решение, которое работает на iOS 8. Ниже приведен swift код:
let label = self.button?.titleLabel label?.minimumScaleFactor = 0.01 label?.adjustsFontSizeToFitWidth = true label?.font = UIFont.systemFontOfSize(100)вы можете играть с ярлыка?.lineBreakMode как я обнаружил, что результаты различаются для разных режимов разрыва.
adjustsFontSizeToFitWidthне работал для меня, пока я не установил ограничение ширины на моей кнопке в Interface Builder.установка ограничения удерживала кнопку от увеличения размера и, следовательно, не понимая, что она должна была сжать текст.
в последнем swift это, кажется, работает для меня
button.titleLabel!.numberOfLines = 1 button.titleLabel!.adjustsFontSizeToFitWidth = true button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping
iOS 10.3 решение на основе других ответов здесь:
button.titleLabel!.numberOfLines = 1 button.titleLabel!.adjustsFontSizeToFitWidth = true button.titleLabel!.baselineAdjustment = .alignCenters
никто не упомянул
baselineAdjustmentвсе же; мне это было нужно, потому что метка кнопки становится вертикально смещенной послеadjustsFontSizeToFitWidthвступает в силу. ЯблокоbaselineAdjustmentдокументы:если
adjustsFontSizeToFitWidthсвойство имеет значениеtrueэтот свойство управляет поведением базовых линий текста в ситуациях где требуется настройка размера шрифта. Значение по умолчанию это свойствоalignBaselines. Это свойство действует только тогда, когда элементnumberOfLinesсвойство имеет значение1.
FWIW, я никогда не мог получить метку идеально выровнены.
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);в итоге я установил размер шрифта, чтобы убедиться, что шрифт был "большим", прежде чем система отрегулирует размер по размеру.
основываясь на ответе Ника Кова:
import UIKit extension UIButton { @IBInspectable var adjustFontSizeToWidth: Bool { get { return titleLabel!.adjustsFontSizeToFitWidth } set { titleLabel!.adjustsFontSizeToFitWidth = newValue titleLabel!.lineBreakMode = .byClipping } } }
расширение 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 } } }

Comments