Ustawienie contentInset
może pomóc w poprawniejszym wyświetlaniu tekstu w obrębie UITextView
. Nie pomoże to jednak rozwiązać problemu z włączonym przewijaniem, mimo że nie ma więcej tekstu do obejrzenia.
Podobnie, metody takie jak sizeWithFont
mają ograniczenia. Jak wyjaśniono w znakomitym blogu Mike'a Wellera, seria iOS Development: You're Doing It Wrong, NSString
nie jest dobrym obiektem do zapytania o to, jak duży powinien być UIView
. Wiele podklas UIView
, takich jak UILabel
, UIButton
, itp. Ma wkładki i inne rozważania, które należy uwzględnić podczas wymiarowania. UITextLabel
nie jest wyjątkiem.
szczególności wejście Mike Weller na ten temat:
You're Doing It Wrong #2: Sizing labels with -[NSString sizeWithFont:...]
iOS 7 obiecuje nam bardziej zaawansowaną obsługę tekstu w UITextView
o właściwościach takich jak textContainerInset
. Ale co zrobić w międzyczasie?
Po pierwsze wiemy, że UITextView
jest podklasą UIScrollView
.Dlatego złota zasada, że jeśli contentSize
jest większa niż właściwość widoku, to przewijany widok będzie przewijany, abyśmy mogli zobaczyć więcej treści.
Sprawdzanie contentSize
agains bounds
nie będzie działać albo, ponieważ wiemy, że UIScrollView
już obliczenia czy należy przewinąć lub nie opiera się na tekście, a to daje nam złą odpowiedź.
Tutaj na ratunek przychodzą arbitralne wartości dopasowania! Dla mnie ta wartość wynosiła 17.f
. Dla Ciebie - w zależności od twoich czcionek - może być inaczej. My wtedy przejąć kontrolę i decyduje, czy powinniśmy pozwolić widok przewijania do przewijania:
static const CGFloat kArbritaryHeight = 17.f;
CGFloat adjustedContentHeight = myTextView.contentSize.height - kArbritaryHeight;
CGFloat boundsHeight = CGRectGetHeight(myTextView.bounds);
BOOL tooMuchContent = adjustedContentHeight > boundsHeight;
if (tooMuchContent)
{
myTextView.scrollEnabled = YES;
}
else
{
myTextView.scrollEnabled = NO;
}