У меня есть простой UIScrollView
с 2 UITextField
s в нем и кусок кода, который не имеет для меня никакого смысла, но он работает.UITextField в UIScrollview
Это экран (я использую Auto Layout):
Вот код:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
- (void)keyboardWillShow:(NSNotification*) notif
{
NSDictionary *info = [notif userInfo];
CGRect keyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardRect = [self.view convertRect:keyboardRect fromView:nil];
UIEdgeInsets contentInset = self.scrollView.contentInset;
contentInset.bottom = keyboardRect.size.height;
self.scrollView.contentInset = contentInset;
}
- (void) keyboardWillHide:(NSNotification*) notif
{
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
_scrollView.contentInset = contentInsets;
}
То, что я бы ожидать, чтобы переместить Scrollview на 352 точек до (высота клавиатуры), так как это значение, которое я установил contentInset.bottom
, и не имеет значения, какой из UITextField
выбран, так как высота клавиатуры всегда одна и та же.
Однако результат заключается в том, что он прокручивается вверх, поэтому UITextField
, который является первым ответчиком, не будет закрыт клавиатурой. Таким образом, он прокручивает больше в случае нижнего UITextField
и меньше в случае верхнего. Это выглядит намного лучше, чем ожидаемый результат, но я не могу понять, почему он работает. Кто-нибудь с объяснением?
Спасибо за ваш ответ. Я был доволен тем, как это работает, я просто не понимаю, почему это работает. Для меня «контент» в 'contentInset' означает как' UITextFields', так и пространство вокруг них, определенное 'contentSize'. Я не понимаю, как 'UIScrollView' знает, что' UITextField' активен и прокручивается именно там. – Levi
Levi, возможно, он ищет текущего ответчика (например, startFirstResponder) и прокрутки к кадру для этого ответчика. –