Остановить анимацию UITableViewCells при анимации UITableView

Я анимирую UITableView. Я хочу, чтобы представление таблицы открывалось следующим образом:

http://www.youtube.com/watch?v=XIGJLbiRsXE

Тем не менее, он открывается так:

http://www.youtube.com/watch?v=UJUX-ILCB_0

Обратите внимание, как анимируются сами ячейки таблицы. Как я могу предотвратить это?

Я использую авторазметку. Таким образом, код:

[theView addSubview:theTable];
[theTable reloadData];
[theTable invalidateIntrinsicContentSize];
[UIView animateWithDuration:.33 animations:^{
    [theView layoutIfNeeded];
 }];

Другие детали, которые могут иметь или не иметь значения:

  • Родителем табличного представления является scrollView

  • Я переопределил innerContentSize табличного представления, чтобы вернуть высоту всех ячеек в табличном представлении, поэтому табличное представление не будет прокручиваться.

  • Я меняю источник данных табличного представления перед его отображением


person dragosaur    schedule 29.04.2013    source источник


Ответы (4)


У меня была аналогичная проблема, и я смог остановить анимацию в UITableViewCell с помощью метода UIView performWithoutAnimation:.

Используйте метод tableView:willDisplayCell:forRowAtIndexPath: UITableViewDelegate, чтобы получить ссылку на ячейку до ее отображения. Затем в блоке performWithoutAnimation: вызовите layoutIfNeeded для объекта ячейки, чтобы дать ему возможность разместить свои подпредставления:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [UIView performWithoutAnimation:^{
        [cell layoutIfNeeded];
    }];
}
person Brian Watkins    schedule 19.10.2014

Может быть, слишком поздно отвечать на этот вопрос, но проблема в таких случаях обычно заключается в том, что блок анимации захватывает все ожидающие макеты, запланированные в следующем цикле выполнения.

Решение, которое я использую. Я вызываю layoutIfNeeded перед анимацией (до установки или отмены каких-либо ограничений), а затем внутри блока анимации.

В вашем случае это будет примерно так,

[theView addSubview:theTable];
[theTable reloadData];
[theView layoutIfNeeded];
[theTable invalidateIntrinsicContentSize];
[UIView animateWithDuration:.33 animations:^{
    [theView layoutIfNeeded];
 }];
person jarora    schedule 02.01.2016

Рассматривали ли вы вместо этого анимацию непрозрачного подвида, расположенного над табличным представлением?

[theView addSubview:theTable];
[theTable reloadData];

UIView *subview = [[UIView alloc] initWithFrame:theTable.frame];
subview.backgroundColor = [UIColor whiteColor];
[theView addSubview:subview];

[UIView animateWithDuration:0.33 animations:^{
    subview.frame = CGRectMake(subview.frame.origin.x, subview.frame.size.height, subview.frame.size.width, 0.0);
}];
person Joshua C. Lerner    schedule 29.04.2013
comment
Я не думаю, что это сработает в моем случае, так как подвиды под таблицей также должны анимироваться вверх и вниз вместе с таблицей. - person dragosaur; 29.04.2013

Попробуйте сначала разместить таблицу, прежде чем вызывать [theView layoutIfNeeded] внутри блока анимации. В идеале вы могли бы размещать макет по частям, и за эти 0,33 секунды вы можете получить полосу прокрутки в таблице, но цель состоит в том, чтобы получить изменения макета ячейки таблицы за пределами анимированного блока.

person James    schedule 30.04.2013