Анимация contentInset в UITableView также анимирует фреймы «подпредставлений» строк - PullRequest
5 голосов
/ 16 марта 2012

У меня есть 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 (который вызывается как деталь или перезагружается), это изменение также анимируется и становится видимым, когда ячейка прокручивается вниз для просмотра.Можно ли избежать такого поведения?

Ответы [ 2 ]

4 голосов
/ 17 марта 2012

Я наконец-то нашел решение: код установки кадра можно исключить из анимации следующим образом:

[CATransaction begin];
[CATransaction setDisableActions:YES];
mainDataView.frame = rect;
[CATransaction commit];

или

[UIView setAnimationsEnabled:NO];
mainDataView.frame = rect;
[UIView setAnimationsEnabled:YES];

Нашел ответ здесь: Как я могу исключить кусок кода внутри основного блока анимации из анимации?

0 голосов
/ 19 июня 2015

Решил эту проблему, установив clipsToBounds ДА в tableview.

tableView.clipsToBounds = YES:

А если у вас все еще есть проблемы, установите clipsToBounds на footerview.

...