2012-10-31 7 views
5

Mam UITableView, który jest nieco większy niż self.view. Mam u dołu widoku UITextField i używam metody delegowania – textFieldDidBeginEditing:, aby przesunąć widok w górę, gdy pole tekstowe zaczyna się edytować.Ustaw UITableView contentOffset, a następnie przeciągnij, wyświetl przeskoki przesunięcia do nowej pozycji

Działa to dobrze, ale jeśli spróbuję przewinąć widok podczas edytowania UITextField (a zawartość jest już przesunięta), zawartość przesuwa się w dół do "odpowiedniej" pozycji widoku. Innymi słowy, zmieniony zestaw I zostanie zmieniony tak, aby był równy rozmiarowi widoku treści (jak można się spodziewać po normalnym zachowaniu).

Jakieś pomysły, jak zawyżać to zachowanie podczas edycji?

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    // Scroll to the currently editing text field 
    [self scrollViewToTextField:textField]; 

} 

- (void)scrollViewToTextField:(id)textField 
{ 
    // Set the current _scrollOffset, so we can return the user after editing 
    _scrollOffsetY = self.tableView.contentOffset.y; 

    // Get a pointer to the text field's cell 
    UITableViewCell *theTextFieldCell = (UITableViewCell *)[textField superview]; 

    // Get the text fields location 
    CGPoint point = [theTextFieldCell convertPoint:theTextFieldCell.frame.origin toView:self.tableView]; 

    // Scroll to cell 
    [self.tableView setContentOffset:CGPointMake(0, point.y - 12) animated: YES]; 
} 

Odpowiedz

12

Sposobem na uniknięcie tego problemu jest zastosowanie contentInset w tym samym czasie. Więc dla powyższego przykładu:

- (void)scrollViewToTextField:(id)textField 
{ 
    // Set the current _scrollOffset, so we can return the user after editing 
    _scrollOffsetY = self.tableView.contentOffset.y; 

    // Get a pointer to the text field's cell 
    UITableViewCell *theTextFieldCell = (UITableViewCell *)[textField superview]; 

    // Get the text fields location 
    CGPoint point = [theTextFieldCell convertPoint:theTextFieldCell.frame.origin toView:self.tableView]; 

    // Scroll to cell 
    [self.tableView setContentOffset:CGPointMake(0, point.y - 12) animated: YES]; 

    // Add some padding at the bottom to 'trick' the scrollView. 
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, point.y - 60, 0)]; 
} 

Następnie należy zresetować wstawka po edycji:

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)]; 
} 

Zastrzeżenie tego podejścia jest to, że trzeba będzie wdrożyć jakąś kontrolę w metodzie - (void)scrollViewDidScroll:(UIScrollView *)scrollView do sprawdź, czy twoje pole tekstowe jest nadal widoczne.

Alternatywą dla tego jest wyłączenie przewijania po rozpoczęciu edycji i ponowne włączenie przewijania po jego zakończeniu. Będziesz musiał zdecydować, czy ta akcja jest szkodliwa dla UX w twojej aplikacji.

1

Chciałbym dodać, że jeśli korzystasz z wejściowych pól tekstowych. I trzeba przewijać następnie zastosować firstResponder że zastosowanie EdgeInset używając:

[self.tableView setContentOffset:CGPointMake(0.0f, 0.0f) animated:YES]; 
[self.tableView setContentInset:UIEdgeInsetsZero]; 

po zatrzymaniu zwój auto, co dzieje się z pól wejściowych wewnątrz UITableView kiedy się ostrość. Dzięki @squarefrog

Powiązane problemy