UILabel sizeToFit non funziona con l'ios6 di autolayout



Answers

In iOS 6, utilizzando l'autolayout, se i lati (o la larghezza) e la parte superiore di UILabel sono bloccati, crescerà automaticamente e si restringerà verticalmente per adattarsi al suo contenuto, senza alcun codice e senza problemi con la sua resistenza alla compressione o altro. È morto semplice.

In casi più complessi, imposta solo l'opzioneMaxLayoutWidth dell'etichetta.

Ad ogni modo, la cosa giusta succede automaticamente.

Question

Come posso configurare a livello di programmazione (e in quale metodo) un UILabel la cui altezza dipende dal suo testo? Ho provato a configurarlo usando una combinazione di Storyboard e codice, ma senza successo. Tutti raccomandano sizeToFit durante l'impostazione di lineBreakMode e numberOfLines . Tuttavia, non importa se inserisco quel codice in viewDidLoad: viewDidAppear: viewDidLayoutSubviews o viewDidLayoutSubviews Non riesco a farlo funzionare. O faccio la scatola troppo piccola per un testo lungo e non cresce, o la ingrandisco troppo e non si riduce.




Sento che dovrei contribuire perché mi ci è voluto un po 'per trovare la soluzione giusta:

  • L'obiettivo è lasciare che Auto Layout faccia il suo lavoro senza mai chiamare sizeToFit (), lo faremo specificando i giusti vincoli:
  • Specificare i vincoli di spazio superiore, inferiore e iniziale / finale sul tuo UILabel
  • Imposta il numero di proprietà delle righe su 0
  • Incrementa il contenuto che abbraccia la priorità a 1000
  • Abbassare la Priorità Resistenza compressione contenuto a 500
  • Sul vincolo del contenitore inferiore, riduci la priorità a 500

Fondamentalmente, quello che succede è che tu dici al tuo UILabel che anche se ha un vincolo di altezza fisso, può fare a pezzi il vincolo per rendersi più piccolo per abbracciare il contenuto (se hai una singola linea per esempio), ma non può rompere il vincolo per renderlo più grande.




UIFont *customFont = myLabel.font;
CGSize size = [trackerStr sizeWithFont:customFont
                             constrainedToSize:myLabel.frame.size // the size here should be the maximum size you want give to the label
                                 lineBreakMode:UILineBreakModeWordWrap];
float numberOfLines = size.height / customFont.lineHeight;
myLabel.numberOfLines = numberOfLines;
myLabel.frame = CGRectMake(258, 18, 224, (numberOfLines * customFont.lineHeight));



Una soluzione che ha funzionato per me; Se il tuo UILabel ha una larghezza fissa, modifica il vincolo da constant = a constant <= nel tuo file di interfaccia




ho risolto con xCode6 mettendo "Preferred Width" su Automatic e pin l'etichetta in alto, in testa e in coda




Notato in IOS7 sizeToFit non funzionava anche - forse la soluzione potrebbe aiutarti anche tu

[textView sizeToFit];
[textView layoutIfNeeded];



Links