ОБНОВЛЕНО : прокрутите вниз для обновления.
У меня есть UITableView, ячейки которого содержат несколько UITextView (ов).Когда пользователь начинает редактировать текст и клавиатуру, я изменяю размер рамки TableView и прокручиваю ячейку редактирования до видимой с помощью метода scrollToRowAtIndexPath ::: из UITableView.Все это прекрасно работает, пока пользователь не начнет печатать.Проблема в том, что каждый раз, когда нажимается клавиша на клавиатуре, значение y свойства contentOffset самого UITableView изменяется.
Я пытаюсь регистрировать это при каждом нажатии клавиши
NSLog(@"%1.2f, %1.2f, %1.2f, %1.2f",
self.table.contentSize.width,
self.table.contentSize.height,
self.table.contentOffset.x,
self.table.contentOffset.y);
И эторезультат
2011-03-17 00:13:05.380 ...[6243:207] 320.00, 355.00, 0.00, 8.00
2011-03-17 00:13:06.138 ...[6243:207] 320.00, 355.00, 0.00, 13.00
2011-03-17 00:13:06.848 ...[6243:207] 320.00, 355.00, 0.00, 8.00
2011-03-17 00:13:07.578 ...[6243:207] 320.00, 355.00, 0.00, 13.00
2011-03-17 00:13:08.377 ...[6243:207] 320.00, 355.00, 0.00, 8.00
Как вы можете видеть, contentOffset.y просто постоянно меняется, и это заставляет TableView подпрыгивать вверх и вниз при каждом нажатии клавиши.В моем коде нет места, которое бы изменяло значение contentOffset в TableView или, по крайней мере, явно.Кто-нибудь знает, что происходит?
Вот код, который я использую для регулировки размера TableView при отображении / скрытии клавиатуры
- (void)keyboardDidShow:(NSNotification *)notification
{
if (keyboardAlreadyShow) // in case user jump from one TextView to another
return;
NSDictionary *userInfo = [notification userInfo];
NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [aValue CGRectValue];
keyboardRect = [self.view convertRect:keyboardRect fromView:nil];
CGFloat keyboardTop = keyboardRect.origin.y;
CGRect newFrame = self.view.bounds;
newFrame.origin.x = self.table.frame.origin.x;
newFrame.size.width = self.table.frame.size.width;
newFrame.size.height = keyboardTop;
NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
NSTimeInterval animationDuration;
[animationDurationValue getValue:&animationDuration];
[UIView animateWithDuration:animationDuration
animations:^{
self.table.frame = newFrame;
}];
NSIndexPath *index = [table indexPathForCell:editingCell];
[self.table scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionNone animated:YES];
keyboardAlreadyShow = YES;
}
- (void)keyboardWillHide:(NSNotification *)notification
{
CGRect newFrame;
newFrame.origin.y = self.table.frame.origin.y;
newFrame.origin.x = self.table.frame.origin.x;
newFrame.size.width = self.table.frame.size.width;
newFrame.size.height = 430;
NSDictionary* userInfo = [notification userInfo];
NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
NSTimeInterval animationDuration;
[animationDurationValue getValue:&animationDuration];
[UIView animateWithDuration:animationDuration
animations:^{
self.table.frame = newFrame;
}];
[self.table scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionNone animated:YES];
}
- (void)keyboardDidHide:(NSNotification *)notification
{
keyboardAlreadyShow = NO;
}
Любая помощь будет очень полезна.Спасибо.
ОБНОВЛЕНО : Теперь я думаю, что могу сузить проблему до этой конкретной строки
txtLatInteger.text = [NSString stringWithFormat:@"...
Какой txtLatInteger является UITextView, находится в TableViewCell и будетобновляться каждый раз, когда другой TextView в другом TableViewCell изменяется.Так что, если я закомментирую эту строку, TableView не будет двигаться.Любая идея, что происходит?
UPDATED2 : похоже, что помещение UITextView в UITableViewCell вызывает эту проблему отскакивания.Измените поле ввода на UITextField, чтобы решить эту проблему (вроде).Но я должен пожертвовать некоторым конкретным поведением, которое мне нужно, из UITextView.:(