2012-06-06 14 views
5

Mam UIScrollView, który ma w sobie kilka dynamicznych widoków, z których każdy ma pole tekstowe. Kiedy zaczynam wpisywać w jednym z pól, chcę przewijać widok przewijania tak, aby pole znajdowało się na górze ekranu (widoczne nad klawiaturą). Działa świetnie; Oto kod:Przewijanie UIScrollView, aby wyświetlić najniższy z kilku pól tekstowych

(void)didStartTyping:(id)sender { 
    [scrollView setContentOffset:CGPointMake(0, subView.frame.origin.y) animated:YES]; 
    scrollView.scrollEnabled = NO; 
} 

(void)didFinishTyping:(id)sender { 
    scrollView.scrollEnabled = YES; 
} 

Ale, gdy widok przewijania jest przewijane do samej góry i zacznę pisać w najniższym polu tekstowym widocznym, nie przewijać tyle daleko (krótka o około 40 px). Dziwne jest to, że działa, gdy przewijam w dół o jeden piksel od góry widoku przewijania, ale kiedy przewijam do góry, zachowuje się zupełnie inaczej.

+1

trzeba rejestrować klatek scollview zarówno w scenariuszu i sprawdzić, co tam jest? To, o czym mogę myśleć, to jak podnieść zapotrzebowanie na offset dolny. – rishi

+0

Cóż, to miałoby sens. Ale na razie brzydkie obejście polegało na zmianie rozmiaru subskrybentów, aby po przewinięciu widoku do góry nie było widać pola tekstowego widoku z dołu. Nie optymalne, ale działa na razie i jeśli wrócę do tego, dam ci znać, jak to działa. Dzięki Rishi. – Gazzini

+1

Można ręcznie przewijać widok przewijania do żądanej pozycji - to znaczy, nie należy ustawiać ostrości pola tekstowego, ale przeciągnij widok przewijania tam, gdzie chcesz się znaleźć, jeśli klawiatura ma się pojawić? Czy możesz przeciągnąć go tam, gdzie chcesz? W większości przypadków, gdy rozmiar zawartości przewijania ściśle obejmuje jego treść, nie można naprawdę dostać ostatniego elementu na górę. Innym sposobem na powiedzenie tego jest, czy możesz spróbować ustawić wysokość rozmiaru treści na znacznie większą niż treść. – danh

Odpowiedz

2

Najlepszy sposób, w jaki udało mi się to zrobić, to chwycić ramkę klawiatury, a następnie zaktualizować moje wstawki przewijania, gdy widok tekstowy pobiera tekstViewDidBeginEditing: wywoływany. Tutaj używam widoku tabeli, ale ta sama logika powinna dotyczyć przewijania, a główną różnicą jest sposób przewijania. Używam scrollToRowAtIndexPath, będziemy chcieli, aby korzystać scrollRectToVisible

//setup keyboard callbacks 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillHideNotification 
               object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    kbFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
} 

//this is called from your UITextViewDelegate when textViewDidBeginEditing: is called 
- (void)updateActiveTextScroll:(UITextView*)textView 
{ 
    activeTextView = textView; 
    UIEdgeInsets inset; 
    UIInterfaceOrientation orient = [[UIApplication sharedApplication] statusBarOrientation]; 
    if(UIInterfaceOrientationIsLandscape(orient)) 
    { 
     inset = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.width, 0.0); 
    } 
    else 
    { 
     inset = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.height, 0.0); 
    } 
    myTableView.contentInset = inset; 
    myTableView.scrollIndicatorInsets = inset; 

    [myTableView scrollToRowAtIndexPath:activeNSIndexPath 
         atScrollPosition:UITableViewScrollPositionBottom 
           animated:YES]; 
} 

//dont forget to reset when the keyboard goes away 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets inset = UIEdgeInsetsZero; 
    myTableView.contentInset = inset; 
    myTableView.scrollIndicatorInsets = inset; 
} 
Powiązane problemy