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.
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.
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.
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
- najbardziej prawdopodobnym powodem jest to, że klawiatura zakrywa twoje
UITextField
. Patrz poniżej rozwiązanie - inną możliwością jest to, że masz inną
UIScrollView
gdzieś w hierarchii widoku pomiędzyUITextField
iUIScrollView
, 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.
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];
}
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ć.
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.
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);
}
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