2013-04-29 1 views
6

Я анимация UITableView. Я хочу, чтобы посмотреть таблицу раздвинуть, как это:Остановить UITableViewCells от анимации при анимации 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

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

  • Я меняю источник данных на перед тем как отобразить его перед тем, как его отобразить

ответ

0

Вы считали, что вместо анимирования вместо непрозрачного подсмотра находится над табличным представлением?

[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); 
}]; 
+0

Я не думаю, что это будет работать в моем случае, так как подвиды ниже таблицы нужно анимировать вверх и вниз с таблицей, а также. – dragosaur

0

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

12

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

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

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [UIView performWithoutAnimation:^{ 
     [cell layoutIfNeeded]; 
    }]; 
} 
1

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

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

В вашем случае это будет что-то вроде этого,

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