Настройка размера шрифта 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];


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

471   9  

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 
        }
    }
}

enter image description here

Comments

    Ничего не найдено.