Jak zrobić automatyczne przewijanie UIScrollView, gdy UITextField stanie się pierwszą odpowiedzią

Widziałem posty wokół tutaj , które sugerują, że UIScrollViews powinno się automatycznie przewijać, jeśli subview UITextField stanie się pierwszym odpowiedzialnym; jednak nie mogę dowiedzieć się, jak to zrobić.

Mam UIViewController, który ma UIScrollView i wewnątrz UIScrollView jest wiele pól tekstowych.

Wiem, jak to zrobić ręcznie, jeśli to konieczne; jednak z tego, co czytałem, wydaje się możliwe, aby mieć to autoscroll. Proszę o pomoc.

Author: Community, 2012-10-24

7 answers

Mam nadzieję, że ten przykład wam pomoże Możesz przewijać do dowolnego punktu za pomocą tego kodu.

scrollView.contentOffset = CGPointMake(0,0);

Więc jeśli masz textfield, musi mieć jakąś pozycję x,y w widoku, więc możesz użyć

CGPoint point = textfield.frame.origin ;
scrollView.contentOffset = point 
To powinno załatwić sprawę.]}

Ale jeśli nie wiesz, kiedy wywołać ten kod, więc powinieneś nauczyć się UITextFieldDelegate metod

Zaimplementuj tę metodę w swoim kodzie

- (void)textFieldDidBeginEditing:(UITextField *)textField {
// Place Scroll Code here
}

Mam nadzieję, że wiesz, jak używać metod delegowania.

 28
Author: Adeel Pervaiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-24 21:10:17

Wiem, że na to pytanie już udzielono odpowiedzi, ale pomyślałem, że podzielę się kombinacją kodu, której użyłem z @Adeel i @ Basil answer, ponieważ wydaje się działać idealnie dla mnie na iOS 9.

-(void)textFieldDidBeginEditing:(UITextField *)textField {

    // Scroll to the text field so that it is
    // not hidden by the keyboard during editing.
    [scroll setContentOffset:CGPointMake(0, (textField.superview.frame.origin.y + (textField.frame.origin.y))) animated:YES];
}

-(void)textFieldDidEndEditing:(UITextField *)textField {

    // Remove any content offset from the scroll
    // view otherwise the scroll view will look odd.
    [scroll setContentOffset:CGPointMake(0, 0) animated:YES];
}

Użyłem również animowanej metody, która sprawia, że przejście jest znacznie płynniejsze.

 10
Author: Supertecnoboff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-21 10:11:36

Nie musisz nic robić ręcznie. Jest to zachowanie domyślne. Istnieją dwie możliwości, dlaczego nie widzisz zachowania

  1. najbardziej prawdopodobnym powodem jest to, że klawiatura zakrywa twoje UITextField. Patrz poniżej rozwiązanie
  2. inną możliwością jest to, że masz inną UIScrollView gdzieś w hierarchii widoku pomiędzy UITextField i UIScrollView, które chcesz automatycznie przewijać. Jest to mniej prawdopodobne, ale nadal może powodować problemy.

Dla #1, ty chcesz zaimplementować coś podobnego do zaleceń Apple dla przenoszenie zawartości, która znajduje się pod klawiaturą . Zauważ, że kod dostarczony przez Apple nie uwzględnia rotacji. Aby uzyskać ulepszenia w ich kodzie, sprawdź implementację w tym wpisie na blogu metody keyboardDidShow, która poprawnie tłumaczy ramkę klawiatury za pomocą okna.

 6
Author: Michael McGuire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-01 17:44:29
- (void)textFieldDidBeginEditing:(UITextField *)textField {
    CGRect rect = [textField bounds];
    rect = [textField convertRect:rect toView:self.scrollView];
    rect.origin.x = 0 ;
    rect.origin.y -= 60 ;
    rect.size.height = 400;

    [self.scrollView scrollRectToVisible:rect animated:YES];
}
 4
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-09 11:56:17

Możesz użyć tej funkcji do autoScroll UITextField

On UITextFieldDelegate

- (void)textFieldDidBeginEditing:(UITextField *)textField {

[self autoScrolTextField:textField onScrollView:self.scrollView];
}




- (void) autoScrolTextField: (UITextField *) textField onScrollView: (UIScrollView *) scrollView { 
 float slidePoint = 0.0f;
float keyBoard_Y_Origin = self.view.bounds.size.height - 216.0f;
float textFieldButtomPoint = textField.superview.frame.origin.y + (textField.frame.origin.y + textField.frame.size.height);

if (keyBoard_Y_Origin < textFieldButtomPoint - scrollView.contentOffset.y) {
    slidePoint = textFieldButtomPoint - keyBoard_Y_Origin + 10.0f;
    CGPoint point = CGPointMake(0.0f, slidePoint);
    scrollView.contentOffset = point;
}

EDIT:

Im now using IQKeyboardManager Chwała twórcy tego, musisz tego spróbować.

 3
Author: Basil Mariano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-15 04:53:43

Oto aktualizacja Swift 4 do odpowiedzi @Supertecnoboff. Świetnie mi to wyszło.

func textFieldDidBeginEditing(_ textField: UITextField) {
    scroll.setContentOffset(CGPoint(x: 0, y: (textField.superview?.frame.origin.y)!), animated: true)
}

func textFieldDidEndEditing(_ textField: UITextField) {
    scroll.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
}

Upewnij się, że rozszerzyłeś uitextfielddelegate i ustawiłeś delegat textfields na self.

 2
Author: donmiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-01 02:19:37

Jeśli masz wiele pól tekstowych powiedz Textfield1, Textfield2, Textfield3 i chcesz przewijać widok przewijania wzdłuż osi y, gdy textfield2 stanie się pierwszą odpowiedzią:

if([Textfield2 isFirstResponder])
{
    scrollView.contentOffset = CGPointMake(0,yourY);
} 
 1
Author: Deep Batra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-24 23:17:28