2014-11-20 7 views
9

Ich versuche, ein UITextView vertikal zu zentrieren, indem ich die entsprechende Höhe aus sizeThatFits verwende. Es gibt eine Fülle anderer Antworten, die nahelegen, dass dies die am besten geeignete Methode ist, dies zu berechnen.iOS 8 sizeThatFits für UITextView-Text liefert nicht die richtige Höhe (AutoLayout)

(Beachten Sie, dass ich es sowohl mit einfachen als auch mit attributierten Strings versucht habe und beide dasselbe Verhalten zeigen).

Egal was ich versuche (auch mit attributierten Strings und der Einstellung der Schriftgröße oder Zeilenhöhe auf etwas größer oder kleiner) zeigt es immer nur eine bestimmte abgeschnittene Anzahl von Zeichen des Textes (in diesem Fall 3 Zeilen, und es ist immer genau gleich). Was vermisse ich?

_textView.text = [_collectionDescription lowercaseString]; 
_textView.font = [UIFont fontLight:22]; 
_textView.textColor = [UIColor whiteColor]; 
_textView.textAlignment = NSTextAlignmentCenter; 
_constraintTextViewHeight.constant = ceilf([_textView sizeThatFits:CGSizeMake(_textView.frame.size.width, FLT_MAX)].height); 

[_textView setNeedsDisplay]; 
[_textView updateConstraints]; 
+0

Haben Sie jemals eine funktionierende Antwort gefunden? Ich habe eine verrückte Zeit, Größe zu bekommen, die funktioniert, unabhängig von der Größe des Textes. Manchmal gibt es am unteren Rand mehr Platz (nicht gemütlich), und manchmal gibt es zusätzlichen Platz, aber die letzte Textzeile fehlt. Etwas? – pizzafilms

+0

Siehe die Antwort unten;) – brandonscript

+0

'sizeThatFits:' ist in iOS 8 veraltet – fabb

Antwort

15

Wie immer bei Autolayout, müssen Sie tun:

[_textInfoView layoutIfNeeded]; 

(brauchen nicht einmal die setNeedsDisplay überhaupt).

So, vollfunktionstüchtig:

_textView.text = [_collectionDescription lowercaseString]; 
_textView.font = [UIFont fontLight:22]; 
_textView.textColor = [UIColor whiteColor]; 
_textView.textAlignment = NSTextAlignmentCenter; 
_constraintTextViewHeight.constant = ceilf([_textView sizeThatFits:CGSizeMake(_textView.frame.size.width, FLT_MAX)].height); 

[_textView layoutIfNeeded]; 
[_textView updateConstraints]; 
+0

Wenn Sie Auto Layout verwenden, rufen Sie einfach '[_textView setNeedsUpdateConstraints]' auf, und das Layout wird durch die Aktualisierung ausgelöst Einschränkungen. Wenn Sie das manuelle Layout verwenden, rufen Sie einfach '[_textView setNeedsLayout]' auf und müssen nicht 'layoutIfNeeded' aufrufen, was automatisch erfolgt. –

0

Statt sizeThatFits: Methode verwenden, können Sie folgende Methode verwenden: gut Sie können dies versuchen:

NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:14]}; 
// NSString class method: boundingRectWithSize:options:attributes:context is 
// available only on ios7.0 sdk. 
NSString *text = _textView.text; 
CGRect rect = [text boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) 
           options:NSStringDrawingUsesLineFragmentOrigin 
           attributes:attributes 
           context:nil]; 
_constraintTextViewHeight.constant = CGRectGetHeight(rect) 

Bei diesem Verfahren werden auch Zeilenumbrüche in Zeichenfolge text

+3

NSDictionary * Attribute = @ {NSFontAttributeName: textView.font}; wäre besser :) –

+0

boundingRectWithSize gibt auch keine genauen Zahlen zurück. Also würde ich diese Lösung lieber vermeiden –

+0

Ich hatte die gleichen Ergebnisse mit sizeThatFits: und boundingRectWithSize :. Beide geben das falsche Ergebnis zurück. – delta2flat