2014-11-20 24 views
9

Bir UITextView öğesini dikey olarak sizeThatFits'dan alınan uygun yükseklikte kullanarak ortalamaya çalışıyorum. Bunu hesaplamanın en uygun yolu olduğunu öne süren çok sayıda başka cevap var.iOS 8 sizeTitFits UITextView metni doğru yükseklikte dönmüyor (AutoLayout)

(Hem düz hem de öznitelikli dizelerle denediğimi ve her ikisinin de aynı davranışı uygulayabildiğimi unutmayın).

Denediğim sorun ne olursa olsun (öznitelikli dizeleri kullanarak ve yazı büyüklüğünü veya satır yüksekliğini daha büyük veya daha küçük bir değere ayarlayarak bile) her zaman yalnızca belirli sayıda kesilmiş karakter karakterini gösterir (bu durumda, 3 satır ve her zaman tam olarak aynı). Neyi kaçırıyorum?

_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

Hiç bir çalışma yanıtı buldunuz mu? Metnin boyutuna bakılmaksızın sizeThatFits'in tutarlı bir şekilde çalışmasını sağlamak için çılgın bir zaman yaşıyorum. Bazen altta fazladan boşluk bırakır (rahat değil) ve bazen fazladan boşluk var ama son metin satırını kaçırıyor. Şey var mı? – pizzafilms

+0

Aşağıdaki cevaba bakın;) – brandonscript

+0

'sizeThatFits:' iOS 8'de kullanımdan kaldırıldı – fabb

cevap

15

Her zaman olduğu gibi AutoLayout ile, yapmanız gereken:

[_textInfoView layoutIfNeeded]; 

(hatta hiç setNeedsDisplay gerekmez). Tam çalışan Yani

:

_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

Otomatik Düzen kullanırken, sadece [_textView setNeedsUpdateConstraints] 'işlevini çağırın ve düzen güncellenerek düzenlenir. kısıtlamaları. Manuel düzeni kullanırken, sadece [_textView setNeedsLayout] 'işlevini çağırın ve otomatik olarak yapılacak olan" layoutIfNeeded "işlevini aramanıza gerek yoktur. –

0

yerine sizeThatFits: yöntemi kullanmak yerine, aşağıdaki yöntemi kullanabilirsiniz: de bunu deneyebilirsiniz:

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) 

Bu yöntem ayrıca dizede satır sonları dikkate text

+3

NSDictionary * öznitelikleri = @ {NSFontAttributeName: textView.font}; daha iyi olurdu :) –

+0

boundingRectWithSize ayrıca doğru sayıları iade etmiyor. Bu yüzden bu çözümden kaçınmayı tercih ederim –

+0

Bende aynı sonuçları kullanıyorum sizeThatFits: ve boundingRectWithSize :. Her ikisi de yanlış sonucu geri verirler. – delta2flat