Відрегулюйте розмір шрифту UIButton по ширині


122

У мене є такий код:

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];

робить роботу, правда?


Він повинен працювати, або theLabel.adjustsFontSizeToFitWidth = ТАК.
Лука

Це працює доtitleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

Відповіді:


291

Спробуйте це:

button.titleLabel.numberOfLines = 1;
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.lineBreakMode = NSLineBreakByClipping; //<-- MAGIC LINE

Я не впевнений, чому це робить фокус, але це так :)


1
дякую, тоді як button.titleLabel.lineBreakMode = UILineBreakModeClip; <-
МАГІЙНА

8
@yunas Замініть UILineBreakModeClip на NSLineBreakByClipping
CodeReaper

1
Nvm, що тільки змінило його numberOfLinesна 0
Marty

34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

повинен виконати роботу самостійно, якщо ви використовуєте функцію автоматичного макета та встановили обмеження на ширину кнопки.

Інші параметри (мінімальний масштабний коефіцієнт, кількість рядків тощо) все ще можна використовувати для подальшого налаштування відповідно до ваших потреб, але вони не потрібні.


15

Відповідь EliBud не працює на iOS 8. Я знайшов рішення, яке працює на iOS 8. Нижче наведено швидкий код:

let label = self.button?.titleLabel
label?.minimumScaleFactor = 0.01
label?.adjustsFontSizeToFitWidth = true
label?.font = UIFont.systemFontOfSize(100)

Ви можете грати з міткою? .LineBreakMode, як я виявив, що результати відрізняються для різних режимів перерви.


.adjustsFontSizeToFitWidth = true - як я можу зробити те ж саме з NSTextField та вікном зміни розміру?
Лев Дабус

Це мені здається таким же, як використання ярлика вибору Xcode IB і розміщення його на мінімальній шкалі шрифту Autoshrink до 0,01
Лео Дабус

при використанні NSTextField немає опції AutoShrink
Leo Dabus

UITextField має можливість автоматичного зменшення тексту, тоді як NSTextField - ні. Тому я думаю, що вам потрібно вручну відрегулювати шрифт, щоб відповідати ширині текстового поля.
Олександр Белявський

10

останнє стрімко це, здається, працює для мене

button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping

10

Рішення iOS 10.3 на основі інших відповідей тут:

    button.titleLabel!.numberOfLines = 1
    button.titleLabel!.adjustsFontSizeToFitWidth = true
    button.titleLabel!.baselineAdjustment = .alignCenters

Ніхто baselineAdjustmentще не згадував ; Мені це знадобилося, оскільки мітка кнопки після adjustsFontSizeToFitWidthнабрання чинності стає вертикально вирівняною . baselineAdjustmentДокументація Apple :

Якщо для adjustsFontSizeToFitWidthвластивості встановлено true, ця властивість контролює поведінку текстових базових ліній у ситуаціях, коли потрібне коригування розміру шрифту. Значенням цієї властивості за замовчуванням є alignBaselines. Ця властивість діє лише тоді, коли для numberOfLinesвластивості встановлено 1.


FWIW, я ніколи не міг отримати етикетку ідеально вирівняною.


8

adjustsFontSizeToFitWidth не працював для мене, поки я не встановив обмеження ширини на своїй кнопці в Interface Builder.

Встановлення обмеження перешкоджало збільшенню розміру кнопки, а отже, не усвідомлюючи її, довелося скоротити текст.


8

Розширення 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 
        }
    }
}

введіть тут опис зображення


для чого ви використовуєте тег?
Запорожченко Олександр

Для того, щоб отримати доступ до геттера
Нік Ков

Чи можете ви глибше описати, що ви маєте на увазі?
Запорожченко Олександр

Я використовую тег, як прапор, щоб визначити, чи налаштування включено.
Нік Ков

чому ви просто не використовуєте self.titleLabel? .adjustsFontSizeToFitWidth? для чого тобі потрібна зайва річ?
Запорожченко Олександр

3

Рішення 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);

Я в кінцевому підсумку встановив розмір шрифту, щоб переконатися, що шрифт був "великим", перш ніж система відкоригує розмір відповідно до розміру.


3

на основі відповіді Ніка Кова:

import UIKit


    extension UIButton {
        @IBInspectable var adjustFontSizeToWidth: Bool {
            get {
                return titleLabel!.adjustsFontSizeToFitWidth
            }
            set {
                titleLabel!.adjustsFontSizeToFitWidth = newValue
                titleLabel!.lineBreakMode             = .byClipping
            }
        }
    }

Це працює, але розмір шрифту значно зменшується, як з 17 до 12. Чи є спосіб збільшити ширину заголовка, коли рядок більший?
Р. Мохан

@ R.Mohan впевнений, але це все про фіксовану ширину. Просто обмеження не фіксуються, і воно зростатиме. Не встановлюйте і ведучих / кінцевих, і не робіть одне з них> =
Запорожченко Олександр

0

Нижче рішення працювало для мене:

button.titleLabel?.adjustsFontForContentSizeCategory = true

Документація розробника пояснює цю властивість як:

Булеве значення, яке вказує, чи об'єкт автоматично оновлює свій шрифт, коли змінюється категорія розміру вмісту пристрою.


0

В 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)
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.