Dopasuj rozmiar czcionki UIButton do szerokości


122

Mam następujący kod:

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

Problem polega na tym, że gdy ciąg znaków w tekście nie jest długi, pokazuje dobrze (1-2 cyfry). Jednak gdy jest dość długi (3 ++ cyfry), widzę tylko czerwony przycisk bez tekstu w środku. Jak to dostosować?

Nie sądzę, żeby:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

wykonuje pracę, prawda?


Powinien działać, lub theLabel.adjustsFontSizeToFitWidth = YES.
Łukasz

Działa dotitleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

Odpowiedzi:


291

Spróbuj tego:

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

Nie jestem pewien, dlaczego to działa, ale tak jest :)


1
dzięki, natomiast button.titleLabel.lineBreakMode = UILineBreakModeClip; <- MAGIC LINE jest teraz amortyzowana
yunas

8
@yunas Zamień UILineBreakModeClip na NSLineBreakByClipping
CodeReaper

1
Nvm, po prostu zmieniło się numberOfLinesna 0
Marty,

34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

powinien sam wykonać pracę, jeśli używasz automatycznego układu i ustawiłeś ograniczenie szerokości przycisku.

Inne opcje (minimalny współczynnik skali, liczba linii itp.) Nadal mogą być używane do dalszego dostosowania do własnych potrzeb, ale nie są wymagane.


15

Odpowiedź od EliBud nie działa na iOS 8. Znalazłem rozwiązanie, które działa na iOS 8. Poniżej znajduje się szybki kod:

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

Możesz grać z etykietą? .LineBreakMode, ponieważ zauważyłem, że wyniki są różne dla różnych trybów przerwania.


.adjustsFontSizeToFitWidth = true - jak mogę zrobić to samo z NSTextField i oknem o zmiennym rozmiarze?
Leo Dabus,

Wydaje mi się, że to tak samo, jak użycie Xcode IB, wybierając etykietę i ustawiając ją na minimalną skalę czcionki Autoshrink na 0,01
Leo Dabus

nie ma opcji AutoShrink podczas korzystania z NSTextField
Leo Dabus,

UITextField ma opcję automatycznego zmniejszania tekstu, podczas gdy NSTextField nie. Myślę więc, że musisz ręcznie dostosować czcionkę, aby dopasować ją do szerokości pola tekstowego.
Alexander Belyavskiy

10

w ostatnim szybkim tempie wydaje mi się, że działa to dla mnie

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

10

Rozwiązanie iOS 10.3 oparte na innych odpowiedziach tutaj:

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

Nikt baselineAdjustmentjeszcze nie wspomniał ; Potrzebowałem tego, ponieważ etykieta przycisku staje się nierówna w pionie po wejściu w adjustsFontSizeToFitWidthżycie. baselineAdjustmentDokumentacja Apple :

Jeśli adjustsFontSizeToFitWidthwłaściwość jest ustawiona na true, ta właściwość steruje zachowaniem linii bazowych tekstu w sytuacjach, w których wymagane jest dostosowanie rozmiaru czcionki. Wartość domyślna tej właściwości to alignBaselines. Ta właściwość jest skuteczna tylko wtedy, gdy numberOfLinesjest ustawiona na 1.


FWIW, nigdy nie mogłem idealnie dopasować etykiety.


8

adjustsFontSizeToFitWidth nie działało, dopóki nie ustawiłem ograniczenia szerokości na moim przycisku w programie Interface Builder.

Ustawienie ograniczenia sprawiło, że przycisk nie powiększył się, a zatem nie zdawał sobie sprawy, że musiał zmniejszyć tekst.


8

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

wprowadź opis obrazu tutaj


do czego używasz tagu?
Zaporozhchenko Oleksandr

By być gotowym do zdobycia gettera
Nik Kov

Czy możesz dokładniej opisać, co masz na myśli?
Zaporozhchenko Oleksandr

Używam tagu jak flagi, aby określić, czy regulacja jest włączona.
Nik Kov,

dlaczego po prostu nie używasz self.titleLabel? .adjustsFontSizeToFitWidth? po co ci dodatkowa rzecz?
Zaporożczenko Oleksandr

4

na podstawie odpowiedzi Nik Kov:

import UIKit


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

To działa, ale rozmiar czcionki znacznie się zmniejsza, na przykład z 17 do 12. Czy istnieje sposób na zwiększenie szerokości etykiety tytułowej, gdy ciąg jest większy?
R. Mohan,

@ R.Mohan jasne, ale to wszystko o stałej szerokości. Po prostu nie naprawiaj ograniczeń, a będzie rosnąć. Nie ustawiaj obu początkowych / końcowych, ani nie rób jednego z nich> =
Zaporozhchenko Oleksandr

3

Rozwiązanie 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);

Skończyło się na ustawieniu rozmiaru czcionki, aby upewnić się, że czcionka jest „duża”, zanim system dostosuje rozmiar.


1

W iOS 13.1 ze Swift 5 musiałem zadbać contentEdgeInsetsrównież o dopasowanie wyściółek.

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

0

Poniższe rozwiązanie zadziałało dla mnie:

button.titleLabel?.adjustsFontForContentSizeCategory = true

Dokumentacja deweloperska wyjaśnia tę nieruchomość jako:

Wartość logiczna wskazująca, czy obiekt automatycznie aktualizuje czcionkę, gdy zmienia się kategoria rozmiaru zawartości urządzenia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.