Я долгое время боролся с проблемой с UIScrollView.
У меня есть UIScrollVIew
, который содержит UITextView
в качестве подпредставления.Когда я выбираю текстовое представление, появляется клавиатура.Я хочу изменить размер текстового представления, чтобы оно вписывалось точно в доступное пространство, а также прокручивать вид прокрутки так, чтобы текстовое представление располагалось точно в видимом пространстве (не скрывалось клавиатурой).
Когда клавиатураПоявляется, я вызываю метод, который вычисляет соответствующий размер для текстового представления, а затем выполняет следующий код:
[UIView animateWithDuration:0.3
animations:^
{
self.textView.frame = frame;
}
];
[self.scrollView setContentOffset:CGPointMake(0,frame.origin.y) animated:YES];
(здесь frame - это соответствующий кадр для текстового представления).
К сожалениюпредставление прокрутки не всегда прокручивается до правильной позиции, особенно когда оно уже имеет ненулевое вертикальное смещение содержимого, когда я выбираю текстовое представление.Я знаю, что смещение содержимого, на которое я его устанавливаю, является правильным.
После долгих испытаний я наконец понял, что после завершения анимации представление прокрутки снова автоматически прокручивается.
Этот код работает:
UIView animateWithDuration:0.3
animations:^
{
self.textView.frame = frame;
}
completion:^(BOOL finished) {
[self.scrollView setContentOffset:CGPointMake(0, frame.origin.y) animated:YES];
}
];
, но выглядит странно, потому что представление прокрутки прокручивается в неправильную позицию, а затем в правую.
Кто-нибудь знает, как я могу запретить представлению прокрутки изменять смещение содержимого, когда рамка текстового представления завершает анимацию?
Я тестирую с использованием iOS 5.0.
Вот решение, которое я нашел и которое работает.Я до сих пор не до конца понимаю, что происходит, возможно, это как-то связано с тем, как установлены мои пружины и стойки.По сути, я уменьшаю размер содержимого вида прокрутки на ту же величину, что и текстовое представление.
- (void)keyboardDidShow:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
// Get the height of the keyboard
CGRect kbRect = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
kbRect = [self.view convertRect:kbRect fromView:nil];
CGSize kbSize = kbRect.size;
// Adjust the height of the text view to fit in the visible view
CGRect frame = self.textView.frame;
int visibleHeight = self.view.frame.size.height;
visibleHeight -= kbSize.height;
frame.size.height = visibleHeight;
// Get the new scroll view content size
CGSize contentSize = self.scrollView.contentSize;
contentSize.height = contentSize.height - self.textView.frame.size.height + frame.size.height;
[UIView animateWithDuration:0.1
animations:^
{
self.textView.frame = frame;
// Note that the scroll view content size needs to be reset, or the scroll view
// may automatically scroll to a new position after the animation is complete.
self.scrollView.contentSize = contentSize;
[self.scrollView setContentOffset:CGPointMake(0, frame.origin.y) animated:YES];
}
];
// Turn off scrolling in scroll view
self.scrollView.scrollEnabled = NO;
}
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
// Update the view layout
[UIView animateWithDuration:0.3 animations:^
{
self.scrollView.contentOffset = CGPointZero;
[self updateViewLayout];
}
];
// Turn on scrolling in the scroll view
self.scrollView.scrollEnabled = YES;
}
([self updateViewLayout]
- это метод, который возвращает представление текста на правильную высоту и сбрасывает представление прокруткиразмер контента, а также убедитесь, что все остальные подпредставления правильно расположены).