2015-02-26 2 views
17

Ho cercato qualcosa per regolare dinamicamente il mio fontSize per adattarlo alla larghezza della mia casella di layout. Ma tutte le risposte che riesco a trovare sono le seguenti:Swift - Regolazione fontSize per adattarsi alla larghezza del layout (programmaticamente)

label.adjustsFontSizeToFitWidth = true 

Che funziona. Ma solo se non ho setTranslatesAutoresizingMaskIntoConstraints impostato su false.

Si prega di notare che non uso storyboard. Quindi, per avere il pieno controllo sui miei altri vincoli ho bisogno di questa linea:

label.setTranslatesAutoresizingMaskIntoConstraints(false) 

Così come posso regolare la dimensione del carattere in base alla larghezza senza l'utilizzo di storyboard e quando non posso usare adjustsFontSizeToFitWidth.

Dopo aver capito come regolare la dimensione del carattere per adattarla alla larghezza. Devo anche regolare l'altezza della casella di layout per adattarla alla dimensione del carattere. Tuttavia sembra esserci documentazione su questo, ma se capita anche la risposta di questo, sarebbe molto apprezzato.

Grazie in anticipo

risposta

24

provare i seguenti comandi per l'etichetta:

label.adjustsFontSizeToFitWidth = true 
label.minimumScaleFactor = 0.2 

e cercare di cambiare le linee del marchio a 0 e 1 (controllare entrambi i casi):

label.numberOfLines = 0 // or 1 
+1

purtroppo non posso usare "label.adjustsFontSizeToFitWidth = true" perché io uso vincoli programmatici e quindi ho bisogno la seguente linea label.setTranslatesAutoresizingMaskIntoConstraints (falso) che sembra rompere adjustFontSizeToFitWith. Ho provato entrambi i tuoi scenari, sfortunatamente senza fortuna. Grazie per la risposta! Lo apprezzo. – MLyck

2

Ho appena fatto ciò di cui avevi bisogno, funziona perfettamente! (SOLO programmaticamente) - Stiamo impostando la dimensione del carattere grande sull'etichetta, in modo da ridimensionarla alla dimensione perfetta del carattere.

self.label.font = UIFont(name: "Heiti TC", size: 60) 
self.label.numberOfLines = 0 
self.label.minimumScaleFactor = 0.1 
self.label.baselineAdjustment = .alignCenters 
self.label.textAlignment = .center 

Se si utilizza layout automatico, implementare questo codice in viewDidLayoutSubviews (dopo il layout è stato allestito).

Distinti, Roi

+0

Sto usando i vincoli programmatici e ho appena impostato .numberOfLines su 0 fatto .adjustsFontSizeToFitWidth ricomincia a lavorare. Grazie – andrewcar

7

Credo che questo vi aiuterà a

Objective C

[lb setMinimumScaleFactor:10.0/[UIFont labelFontSize]]; lb.adjustsFontSizeToFitWidth = YES;

Swift 3,0

lb.minimumScaleFactor = 10/UIFont.labelFontSize lb.adjustsFontSizeToFitWidth = true

+1

Si prega di spiegare come funziona, sarebbe bello se si è –

+1

Risposta non corrisponde alla lingua della domanda – shim

+0

@shim Grazie per il commento! Modificato –

2

Non so se questo completerà ely rispondi alla tua domanda, ma puoi usare questa estensione per calcolare le dimensioni del tuo carattere per adattarle.

extension String { 
    func height(constrainedBy width: CGFloat, with font: UIFont) -> CGFloat { 
     let constraintSize = CGSize(width: width, height: .max) 
     let boundingBox = self.boundingRectWithSize(constraintSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) 

     return boundingBox.height 
    } 

    func width(constrainedBy height: CGFloat, with font: UIFont) -> CGFloat { 
     let constrainedSize = CGSize(width: .max, height: height) 
     let boundingBox = self.boundingRectWithSize(constrainedSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) 

     return boundingBox.width 
    } 
} 
0

Ecco una soluzione trucco:

var size: CGFloat = 20 

    while titleLabel.frame.width > containerView.frame.width { 

     titleLabel.font = UIFont.systemFont(ofSize: size) 
     titleLabel.sizeToFit() 
     size -= 1 

    }