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.




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




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



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.




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

[textView sizeToFit];
[textView layoutIfNeeded];



Related