2013-06-17 7 views
12

Ich versuche eine eingeschränkte UITableViewCell Unterklasse zu implementieren und alles funktioniert perfekt, mit Ausnahme der UILabel. Die Constraints, die ich eingerichtet habe, werden definitiv erzwungen, aber der Text innerhalb des Labels wird nicht auf eine kleinere Schriftgröße skaliert, wenn die Constraints kollidieren. Stattdessen wird die Höhe des UILabel abgeschnitten und die Schrift bleibt gleich groß, dh die Buchstaben werden oben und unten abgeschnitten.UILabellentext wird nicht automatisch mit Auto Layout geändert

Gibt es eine Methode, die ich aufrufen muss, um dies zu erreichen? Ich würde denken, Auto-Layout wäre schlau genug, um die Schriftgröße automatisch zu ändern, also bin ich irgendwie verloren, warum das passiert.

Relevant Code:

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

Grundsätzlich werden diese Einschränkungen bedeutete eine Zelle zu erzwingen, wo otherView auf der linken Seite ist, ist aTextField auf der rechten Seite von otherView bei der gleichen y-Ebene, und das Label ist unter aTextField und rechts unten otherView.

Wie immer, danke für jede Hilfe mit diesem.

+0

Erhalten Sie eine Ausnahme oder eine andere Protokollmeldung in Ihrer Konsole, wenn Sie diese Einschränkungen hinzufügen? – larsacus

+0

Nein, ich habe die Teile, die diese Einschränkung verwendeten, los. –

Antwort

7

Sie benötigen

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

Dann wird der Etikettenschriftgröße automatisch eingestellt werden.

+2

Danke für die Antwort, aber nach der Implementierung dieses Codes bleibt es immer noch oben und unten abgeschnitten. Ich habe die Schriftgröße 18.0f. Ich habe die Schriftart getestet und das Minimum, das es zu passen hat, ist 13.0f, also verstehe ich nicht, warum es nicht automatisch herunterskaliert wird, bis der 0.5f Multiplikator erreicht ist. –

2

Zusammen mit den Einstellungen adjustsFontSizeToFitWidth und minimumScaleFactor müssen Sie auch die Inhaltskomprimierung der Beschriftung auf eine niedrige Priorität setzen. Überprüfen Sie den Abschnitt "Komprimierung Widerstand und Inhalt Hugging" dieser objc.io essay. Grundsätzlich, wenn Ihr Etikett eine niedrigere Kompressionswiderstand Priorität als die hintere Einschränkung hat, sollte das Etikett der Größe verändert erhalten:

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

Wenn das Label abgeschnitten wird, sollte der Komprimierungswiderstand hoch und nicht niedrig sein. Nicht wahr? – smileBot

2

Ich löste dieses Problem, indem eine erforderliche Breite Einschränkung der Ansicht Einstellung Ich war die Verknüpfung des Etiketts an.

Und stellen Sie sicher, dass die Priorität für diese Einschränkung auf UILayoutPriorityRequired festgelegt ist.

[constraint setPriority:UILayoutPriorityRequired]; 

Text wurde Ändern der Größe, wenn das Etikett an die Super Pinning aber nicht beschränkt auf das Textfeld ein, so dass ich ableiten muß es für die Beschriftung der endgültigen Breite in der Layout-Berechnung einbezogen ein Problem mit intrinsischen Größen von Elementen sein.

+1

Was ist 'Größe' in' Konstante: Größe'? – jowie

+0

Es ist die tatsächliche Ansichtsbreite, die Sie einschränken möchten. Ich änderte es in die Breite, wie es sein sollte. Danke, dass Sie den Fehler bemerkt haben – ale0xB