2013-07-06 12 views
10

Ho cercato per due giorni per modificare la cornice di un UILabel, che è ridicolo ... Il UILabel è un IBOutlet, ma non è questo il motivo per cui non funziona: ho cercato di creare un UILabel programatically e ancora non ha funzionato. Ecco come lo faccio:Perché non posso cambiare il frame della mia UILabel?

self.descriptionLabel.text = description; 
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 
CGFloat frameHeight = textSize.height; 
CGRect frame = self.descriptionLabel.frame; 
frame.size.height = frameHeight; 
self.descriptionLabel.frame = frame; 

CGRect bounds = self.descriptionLabel.frame; 
bounds.origin.x = self.descriptionLabel.frame.origin.x + 10.0; 
bounds.size.width = self.descriptionLabel.frame.size.width - 20.0; 
self.descriptionLabel.bounds = bounds; 
self.descriptionLabel.numberOfLines = 0; 

ho già chiesto su IRC e mi hanno detto che non v'è alcun motivo per cui il telaio non sarebbe cambiato ...

Ho anche cercato di creare una cornice con CGRectMake e dargli un valore arbitrario ma questo non ha fatto il trucco o ..

Qualcuno sa quale potrebbe essere il problema per favore?

Edit 1: mi sono collegato al telaio prima e dopo, e ho ottenuto risultati strani:

Before: 0.000000 0.000000 0.000000 0.000000 
After: 0.000000 0.000000 0.000000 33525.000000 

L'altezza dopo essere stata impostata la cornice è l'unico valore che abbia un senso (ho un sacco di testo nell'etichetta apposta).

Edit 2: Ho cambiato il codice come segue, il registro dice che il telaio cambiato, ma sul simulatore non cambiava; L'ho provato aggiungendo i bordi rossi allo strato di UILabel.

self.descriptionLabel.text = description; 
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.view.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 
CGFloat frameHeight = textSize.height; 
CGRect frame = CGRectMake(0.0, 300.0, self.view.frame.size.width, frameHeight); 
self.descriptionLabel.frame = frame; 

DDLogInfo(@"After: %f %f %f %f", self.descriptionLabel.frame.origin.x, self.descriptionLabel.frame.origin.y, self.descriptionLabel.frame.size.width, self.descriptionLabel.frame.size.height); 
// After: 0.000000 300.000000 320.000000 585.000000 

self.descriptionLabel.numberOfLines = 0; 
self.descriptionLabel.layer.borderColor = [UIColor redColor].CGColor; 
self.descriptionLabel.layer.borderWidth = 2; 

Proof

+0

Hai registrato il frame prima e dopo? E perché stai cambiando i limiti (in particolare utilizzando la cornice, che si trova in uno spazio di coordinate diverso)? – Wain

+0

Ho registrato il frame prima e dopo come suggerito e ho ottenuto risultati strani che ho incluso nella domanda che ho editato. –

+1

Perché stai impostando il numero di linee su 0 alla fine? – Abizern

risposta

26

Se si utilizza il layout automatico, non si dovrebbero eseguire impostazioni sui fotogrammi: disattivare il layout automatico o utilizzare i vincoli per modificare le dimensioni dell'etichetta. Il modo più semplice per farlo è quello di fornire all'IBL un vincolo di altezza (e anche una larghezza, se si desidera una larghezza costante) in IB, e creare un IBOutlet. Quindi, nel codice, modifica il valore costante di tale vincolo in base al valore che ottieni da sizeWithFont: constrainedToSize: lineBreakMode :.

+0

Ha funzionato !! Grazie mille!! –

+0

Ha funzionato alla grande. Non è ovvio come aggiornare il vincolo. Ecco come lo fai: self.labelWidthContraint.constant = size.width; self.labelHeightContraint.constant = size.height; – ddiego

+0

Non esattamente intuitivo, ma ha funzionato bene - grazie Mr Delmar! – BonanzaDriver

0

L'etichetta ha un telaio a zero per cominciare, quindi, quando si esegue questa operazione:

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 

Stai chiedendo il metodo sizeWithFont di fare qualcosa di fatto impossibile - dirà tu l'altezza che è richiesta quando non è consentita la larghezza. La risposta che fornisce (33525.000000) è probabilmente l'altezza se un personaggio è ammesso su ogni riga o qualcosa del genere.

Quindi, impostare la larghezza dell'etichetta prima di iniziare o fornire la larghezza consentita al metodo sizeWithFont e quindi impostare la dimensione dell'etichetta utilizzando la risposta (non solo l'altezza).

Inoltre, considera ciò che stai cercando di fare modificando i limiti. Commenta il codice fino a ottenere almeno il frame giusto, quindi puoi aggiungerlo nuovamente e controllare che faccia effettivamente ciò che desideri.

+0

Vedi la mia ultima modifica. Ho seguito i tuoi suggerimenti e nel log il frame è cambiato ma non ha fatto nulla nel simulatore ... –

+0

E questo è l'unico codice che hai che fa qualcosa per l'etichetta? Dove si trova quel codice (che metodo è e quando viene chiamato)? Quali sono le regole di ridimensionamento automatico/auto-layout? – Wain

+0

Ho aggiunto UILabel da IB e non ho toccato i vincoli di impaginazione automatica. Ecco il file completo in cui si trova questo codice: https://gist.github.com/AzizLight/40b66b2daa2917952d6f Come puoi vedere, UILabel è configurato in 'viewDidLoad' e questo è tutto ... –