Regola la dimensione del carattere del pulsante UIB alla larghezza


122

Ho il codice seguente:

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

Il problema è che quando la stringa nel testo non è lunga, mostra bene (1-2 cifre). Tuttavia, quando è piuttosto lungo (3 ++ cifre), tutto ciò che posso vedere è un pulsante rosso, senza testo all'interno. Come lo aggiusto?

Non credo che:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

fa il lavoro, giusto?


Dovrebbe funzionare, oppure theLabel.adjustsFontSizeToFitWidth = YES.
Luca

Funziona datitleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

Risposte:


291

Prova questo:

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

Non sono sicuro del motivo per cui questo funziona ma lo fa :)


1
grazie, considerando che button.titleLabel.lineBreakMode = UILineBreakModeClip; <- MAGIC LINE è ora ammortizzato
yunas

8
@yunas Sostituisci UILineBreakModeClip con NSLineBreakByClipping
CodeReaper

1
Nvm, questo l'ha appena cambiato numberOfLinesin 0
Marty

34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

dovrebbe fare il lavoro da solo se stai usando Auto-Layout e hai impostato un vincolo sulla larghezza del pulsante.

Le altre opzioni (fattore di scala minimo, numero di righe ecc.) Possono ancora essere utilizzate per personalizzare ulteriormente in base alle proprie esigenze, ma non sono necessarie.


15

La risposta di EliBud non funziona su iOS 8. Ho trovato una soluzione che funziona su iOS 8. Di seguito è riportato un codice swift:

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

Puoi giocare con l'etichetta? .LineBreakMode poiché ho scoperto che i risultati variano a seconda delle diverse modalità di interruzione.


.adjustsFontSizeToFitWidth = true - come posso fare lo stesso con un NSTextField e una finestra ridimensionabile?
Leo Dabus

Mi sembra che sia lo stesso dell'utilizzo di Xcode IB selezionando l'etichetta e impostandola su Autoshrink scala minima dei caratteri su 0,01
Leo Dabus

non è disponibile alcuna opzione di restringimento automatico quando si utilizza NSTextField
Leo Dabus

UITextField ha un'opzione per ridurre automaticamente il testo, mentre NSTextField no. Quindi penso che tu abbia bisogno di regolare manualmente il carattere per adattarlo alla larghezza del campo di testo.
Alexander Belyavskiy

10

negli ultimi tempi questo sembra funzionare per me

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

10

Soluzione iOS 10.3 basata sulle altre risposte qui:

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

Nessuno ha baselineAdjustmentancora menzionato ; Ne avevo bisogno perché l'etichetta del pulsante diventa disallineata verticalmente dopo che adjustsFontSizeToFitWidthha avuto effetto. baselineAdjustmentDocumentazione di Apple :

Se la adjustsFontSizeToFitWidthproprietà è impostata su true, questa proprietà controlla il comportamento delle linee di base del testo in situazioni in cui è richiesta la regolazione della dimensione del carattere. Il valore predefinito di questa proprietà è alignBaselines. Questa proprietà è effettiva solo quando la numberOfLinesproprietà è impostata su 1.


FWIW, non sono mai riuscito ad allineare perfettamente l'etichetta.


8

adjustsFontSizeToFitWidth non funzionava fino a quando non ho impostato un vincolo di larghezza sul mio pulsante in Interface Builder.

L'impostazione del vincolo ha impedito al pulsante di aumentare di dimensioni e quindi non rendersi conto di dover ridurre il testo.


8

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

inserisci qui la descrizione dell'immagine


per cosa usi il tag?
Zaporozhchenko Oleksandr

Per essere disponibile a fare il getter
Nik Kov

Puoi descrivere più profondamente cosa intendi, per favore?
Zaporozhchenko Oleksandr

Uso il tag come una bandiera per definire se la regolazione è abilitata.
Nik Kov

perché non usi semplicemente self.titleLabel? .adjustsFontSizeToFitWidth? per cosa hai bisogno di qualcosa in più?
Zaporozhchenko Oleksandr

3

Soluzione 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);

Ho finito per impostare la dimensione del carattere per assicurarmi che fosse "grande" prima che il sistema regolasse la dimensione per adattarla.


3

basato sulla risposta di Nik Kov:

import UIKit


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

Funziona, ma la dimensione del carattere sta diminuendo molto, come da 17 a 12. C'è un modo per aumentare la larghezza dell'etichetta del titolo quando la stringa è più grande?
R. Mohan

@ R.Mohan certo, ma si tratta solo di larghezza fissa. Basta fare in modo che i vincoli non siano fissi e crescerà. Non impostare entrambe le posizioni iniziali / finali o crearne una> =
Zaporozhchenko Oleksandr

0

La soluzione sotto ha funzionato per me:

button.titleLabel?.adjustsFontForContentSizeCategory = true

La documentazione per sviluppatori spiega questa proprietà come:

Un valore booleano che indica se l'oggetto aggiorna automaticamente il proprio carattere quando cambia la categoria delle dimensioni del contenuto del dispositivo.


0

In iOS 13.1 con Swift 5, dovevo provvedere contentEdgeInsetsanche alla regolazione delle imbottiture.

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)
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.