У меня есть UITableView с пользовательскими ячейками.Естественно, в cellForRowAtIndexPath я пытаюсь удалить из памяти старую ячейку и использовать ее повторно.Каждая ячейка имеет иерархию автоматически изменяемых размеров: я устанавливаю рамку вида сверху, когда устанавливаю ее содержимое в cellForRowAtIndexPath, а ее подпредставления соответственно меняют свои кадры.Обратите внимание, что высота строки тоже динамическая.Все хорошо работает, когда я просто прокручиваю таблицу (со строками разного содержимого и фреймами).Но у меня также есть текстовое поле в том же виде, что и в этой таблице, поэтому мне нужно прокрутить содержимое таблицы, чтобы компенсировать отображение / скрытие клавиатуры.Для этого я анимирую свойство contentInset:
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
NSTimeInterval animationDuration = [[aNotification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
UIViewAnimationCurve animationCurve = [[aNotification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
[UIView setAnimationCurve:animationCurve];
[UIView animateWithDuration:animationDuration animations:^{
messagesTable.contentInset = UIEdgeInsetsMake(0, 0, kHSTableBottomInset, 0);
messagesTable.scrollIndicatorInsets = UIEdgeInsetsZero;
}];
}
Это тоже хорошо работает, но есть интересный глюк: когда клавиатура скрыта, а contentInset возвращается в нормальное состояние (kHSTableBottomInset - это небольшое значение для сохранения поля),Таблица перезагрузит ячейки, которые будут прокручиваться сверху для отображения.Проблема в том, что эта перезагрузка также выполняется внутри блока анимации!В результате, когда я изменяю ослабленный кадр подпредставления (в частности, ширину) в cellForRowAtIndexPath (который вызывается как деталь или перезагружается), это изменение также анимируется и становится видимым, когда ячейка прокручивается вниз для просмотра.Можно ли избежать такого поведения?