2013-10-04 15 views
10

Mam widok tabeli z komórkami statycznymi. Jedna komórka zawiera numer UITextView, a numer heightForRowAtIndexPath: jest obliczany dynamicznie, dzięki czemu komórka jest zawsze wystarczająco wysoka, aby pomieścić tekst (część zajęła się w rzeczywistości w systemie iOS 7, ponieważ nie można już po prostu zapytać o tekstView dla jego contentSize).UITableView w iOS 7 nie przewija do poprawnej lokalizacji podczas edycji UITextView w komórce

Gdy stukam w widoku tekstowym, aby rozpocząć edycję, klawiatura animuje się na miejscu, zawartośćInIndele na tableView są automatycznie dostosowywane do tego celu (tj. Dolna wstawka 216px dla orientacji pionowej iPhone'a), kursor/suwak staje się widoczny, a następnie widok tabeli przewija się do innej lokalizacji. To kończy się wyglądać jak odbicie.

Oto film o tym w symulatorze: https://www.dropbox.com/s/htdbb0t7985u6n4/textview-bounce.mov

Zauważ, że na drugi daszek jest tuż nad klawiaturą. Logowałem widok tabeli contentOffset i widzę, że przewija on ładną wartość, a następnie nagle "odwraca się" i przewija do tyłu.

Co dziwne, jeśli włączę wolne animacje w symulatorze, problem znika; odwrócenie contentOffset się nie dzieje i wszystko działa zgodnie z oczekiwaniami (tj. zachowanie iOS 6).

Oto wideo z wolnymi animacji: https://www.dropbox.com/s/nhn7vspx86t4exb/textview-nobounce.mov

notatki realizacji:

  • Widok tekst jest różowy i ma ograniczeń autoLayout że Keep it przypięte do celi w odległości 0 (z wyjątkiem lewej strony, która to 10pt)
  • Używam boundingRectWithSize: do obliczenia wysokości widoku tabeli, dostosowując do liniiFragmentPadding i wszelkich wstawek z góry/z dołu. Wydaje się działać.
  • mam ustawić TextView nie być przewijane, ale nie zauważył niczego innego, gdy scrollEnabled == TAK
  • Jest to kontroler widoku tabeli i automaticallyAdjustsScrollViewInsets == TAK
+1

Mam dokładnie taki sam problem, mam śledzone go do contentSize z zerują UITableView po Robię beginupdates UITableView i endupdates – perrohunter

Odpowiedz

3

Spróbuj ustawić ramkę UITableView kiedy pojawi się klawiatura. Zadzwoń pod [self attachKeyboardHelper] w viewWillAppear i [self detachKeyboardHelper] w viewWillDisappear.

- (void)attachKeyboardHelper{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillAppear:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillHide:) 
               name:UIKeyboardWillHideNotification 
               object:nil]; 
} 

- (void)detachKeyboardHelper{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void)keyboardWillAppear:(NSNotification *)notification{ 
    NSDictionary* userInfo = [notification userInfo]; 

    NSTimeInterval animationDuration; 
    UIViewAnimationCurve animationCurve; 
    CGRect keyboardEndFrame; 

    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve]; 
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration]; 
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame]; 

    // Animate up or down 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:animationDuration]; 

    CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil]; 
    if(self.view==self.tableView){ 
     CGRect newTableFrame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, self.view.bounds.size.height-keyboardFrame.size.height); 
     self.tableView.frame = newTableFrame; 
    }else{ 
     CGRect newTableFrame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, self.view.bounds.size.height-self.tableView.frame.origin.y-keyboardFrame.size.height); 
     self.tableView.frame = newTableFrame; 
    } 

    [UIView commitAnimations]; 
} 

- (void)keyboardWillHide:(NSNotification *)notification{ 
    NSDictionary* userInfo = [notification userInfo]; 

    NSTimeInterval animationDuration; 
    UIViewAnimationCurve animationCurve; 
    CGRect keyboardEndFrame; 

    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve]; 
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration]; 
    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame]; 


    CGRect newTableFrame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, self.view.superview.bounds.size.height-self.tableView.frame.origin.y); 
    self.tableView.frame = newTableFrame; 
    if(newTableFrame.size.height>self.tableView.contentSize.height-self.tableView.contentOffset.y){ 
     float newOffset=MAX(self.tableView.contentSize.height-newTableFrame.size.height, 0); 
     [self.tableView setContentOffset:CGPointMake(0, newOffset) animated:YES]; 
    } 

} 
+0

Czy masz kod źródłowy? –

+1

Dodałem kod źródłowy – VChemezov

+0

Odpowiedź na to pytanie znacznie poprawiła się na przykładzie. Dobre dla początkujących, którzy próbują znaleźć odpowiedzi tutaj ;-) –

Powiązane problemy