Подтвердить что ты не робот

Отрегулируйте размер шрифта 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];

выполняет работу, верно?

4b9b3361

Ответ 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)
        }
    }
}