2012-07-04 12 views
5

Mam to UITextView, które działa świetnie, z tym wyjątkiem, że nie mogę uzyskać tekstu wewnątrz UITextView, aby rozpocząć przewijanie dopiero po prawie pełnym rozmiarze UITextView, UITextView ma 4 linie wysokości, ale gdy tylko dojdę do drugiej linii, pierwsza linia zostanie przesunięta w górę, nie chcę, aby widok zaczął się przewijać, dopóki nie osiągnę 5 linii. scrollingEnabled = NO powstrzymuje to przewijanie, więc to nie zadziałało.Jak mogę przekonwertować UITextView tylko wtedy, gdy jest on pełen tekstu?

UITextView *barf_ = [[UITextView alloc] initWithFrame:CGRectMake(20.0, 310.0, 155, 50)]; 

barf_.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); 

//[barf_ scrollRangeToVisible:NSMakeRange([barf_.text length], 0)]; 

barf_.layer.cornerRadius = 3.0f; 

barf_.layer.borderWidth = 0.5f; 

barf_.font = [UIFont fontWithName:@"Helvetica" size:13]; 

Odpowiedz

0

Można użyć metody sizeWithFont:constrainedToSize:lineBreakMode: aby sprawdzić, czy ciąg rzeczywiście czynią większe niż widoku tekstu i sprawdzić, czy trzeba włączyć przewijanie. Będziesz musiał zadzwonić za każdym razem, gdy zostanie ustawiony tekst w twoim przewijanym widoku.

ex:

CGSize barfStringSize = [barfString sizeWithFont:[barf_ font] 
           constrainedToSize:CGSizeMake(barf_.bounds.size.width, MAXFLOAT) 
            lineBreakMode:UILineBreakModeWordWrap] 
[barf_ setScrollEnabled:barfStringSize.height > barf_.bounds.size.height] 
2

Gdy UITextView jest załadowany zestaw scrollEnabled NO. Następnie ustawić delegata widoku tekstowego do self lub jakiś inny przedmiot i wdrożenie metody UITextViewDelegate

- (void)textViewDidChange:(UITextView *)textView 

Ta metoda będzie sprawdzony w każdej chwili użytkownik wprowadza zmiany do tekstu wewnątrz widoku. Wewnątrz tej metody musisz dowiedzieć się, jak duży jest twój tekst i czy wykracza poza granice widoku tekstowego. Jeśli tak, włącz przewijanie. Użyj tej metody:

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode 

To jest metoda kategorii UIKit na NSString. Zwraca CGSize, który wskaże wysokość dowolnego łańcucha tekstowego, na który go wywołasz. W twoim przypadku to byłoby coś

CGSize textSize = [textView.text sizeWithFont:textView.font 
          constrainedToSize:CGSizeMake(textView.frame.size.width, MAXFLOAT) 
           lineBreakMode:UILineBreakModeWordWrap]; 
if (textSize.height > textView.frame.size.height) { 
    textView.scrollEnabled = YES; 
} else { 
    textView.scrollEnabled = NO; 
} 
2

Znalazłem odpowiedź, jak inni z podobnymi problemami ma wzmianki, z małym TextView, automatycznie dodaje 32 dopełnienie do dołu.

Prostą poprawką jest dodanie YourTextView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); w metodzie shouldChangeTextInRange, która naprawiła mój problem!

2

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; 
} 
Powiązane problemy