2013-06-17 6 views
12

Sto cercando di implementare una sottoclasse vincolata UITableViewCell e tutto funziona perfettamente, ad eccezione dello UILabel. I vincoli che ho impostato vengono definitivamente applicati, ma il testo all'interno dell'etichetta non viene ridimensionato a una dimensione inferiore quando i vincoli si scontrano. Invece, l'altezza di UILabel viene troncata e il carattere rimane della stessa dimensione, il che significa che le lettere vengono troncate nella parte superiore e inferiore.Testo UILabel non ridimensionato automaticamente utilizzando Auto Layout

C'è qualche metodo che devo chiamare per farlo funzionare? Penserei che il layout automatico sarebbe abbastanza intelligente da ridimensionare automaticamente la dimensione del carattere, quindi sono un po 'perso perché questo sta accadendo.

Codice Rilevante:

self.label = [[UILabel alloc] initWithFrame:CGRectZero]; 
self.label.textColor = [UIColor whiteColor]; 
self.label.translatesAutoresizingMaskIntoConstraints = NO; 
self.label.textAlignment = NSTextAlignmentCenter; 
self.label.numberOfLines = 1; 
[self.contentView addSubview:self.label]; 

NSLayoutConstraint *otherViewToLabelHorizontalConstraint = // Make sure that the label is always to the right of the other view. 
        [NSLayoutConstraint constraintWithItem:self.label 
               attribute:NSLayoutAttributeLeft 
               relatedBy:NSLayoutRelationGreaterThanOrEqual 
                toItem:self.otherView 
               attribute:NSLayoutAttributeRight 
               multiplier:1.0 
                constant:0.0]; 

NSLayoutConstraint *aTextFieldToLabelVerticalConstraint = 
        [NSLayoutConstraint constraintWithItem:self.label 
               attribute:NSLayoutAttributeTop 
               relatedBy:NSLayoutRelationGreaterThanOrEqual 
                toItem:self.aTextField 
               attribute:NSLayoutAttributeBottom 
               multiplier:1.0 
                constant:0.0]; 

Fondamentalmente, questi vincoli hanno lo scopo di applicare una cella dove otherView è sulla sinistra, aTextField è sulla destra della otherView allo stesso y-livello, e l'etichetta è inferiore a aTextField ea destra del fondo di otherView.

Come al solito, grazie per qualsiasi aiuto con questo.

+0

Si sta ricevendo un'eccezione o qualche altro messaggio di registro nella console quando si aggiungono questi vincoli? – larsacus

+0

No, ho finito per sbarazzarmi delle parti che hanno usato questo vincolo, però. –

risposta

7

È necessario

myLabel.adjustsFontSizeToFitWidth = YES; 
myLabel.minimumScaleFactor = .5f; 

Quindi la dimensione del carattere etichetta verrà automaticamente regolata.

+2

Grazie per la risposta, ma dopo aver implementato questo codice, rimane ancora tagliato in alto e in basso. Ho il carattere di 18.0f. Ho testato il font e il minimo necessario per adattarlo è 13.0f, quindi non capisco perché non lo ridimensiona automaticamente finché non viene raggiunto il moltiplicatore 0.5f. –

2

Insieme all'impostazione di adjustsFontSizeToFitWidth e allo minimumScaleFactor, è inoltre necessario impostare la compressione del contenuto dell'etichetta per avere una priorità bassa. Controlla la sezione "Resistenza alla compressione e avvolgimento del contenuto" di questo objc.io essay. In sostanza, se l'etichetta ha una priorità resistenza alla compressione inferiore al vincolo finale, l'etichetta deve ottenere ridimensionata:

[myLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow 
           forAxis:UILayoutConstraintAxisHorizontal]; 
+0

Se l'etichetta sta troncando, si desidera una resistenza alla compressione alta, non bassa. Non è vero? – smileBot

2

Ho risolto questo problema impostando un vincolo larghezza richiesta per la vista che legava l'etichetta.

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0f constant:width]; 

E assicurarsi che la priorità per questo vincolo sia impostata su UILayoutPriorityRequired.

[constraint setPriority:UILayoutPriorityRequired]; 

testo è stato ridimensionamento quando appunta l'etichetta superview ma non al textfield, quindi dedotto ci deve essere un problema con le dimensioni intrinseche degli elementi coinvolti nel calcolo layout per larghezza finale dell'etichetta.

+1

cosa è 'size' in' constant: size'? – jowie

+0

È la larghezza effettiva della vista che si desidera limitare. L'ho cambiato in larghezza, come dovrebbe essere. Grazie per aver notato l'errore – ale0xB