2013-08-05 3 views
3

В моем экземпляре UITableView я перемещаю ячейку в индекс: 0 и перезагружая данные. Проблема в том, что ячейка «привязывается» к вершине (из-за reloadData, я думаю). Мне интересно, могу ли я переместить ячейку вверх, а затем применить reloadData через несколько секунд. Heres мой код:Использование анимации с reloadData

[_toDoItems removeObject:todoItem]; 

[_toDoItems insertObject:todoItem atIndex:0 ]; 





[self.tableView beginUpdates]; 

[self.tableView moveRowAtIndexPath:origIndexPath toIndexPath:0]; 

[self.tableView endUpdates]; 

sleep(1); 
[self.tableView reloadData]; 

проблема с этим, после того, как метод вызывается, все паузы в течение 1 секунды, то «привязать» анимации происходит.

+1

Что использование 'сна (1) ; '? Убери это. – Souljacker

+3

'sleep()' никогда не должно использоваться. Он блокирует все потоки, включая основной, который обрабатывает все визуальные эффекты. Вот почему вы видите его в ожидании секунды, а затем щелкая. Привязка просто ждет, пока его протекторы будут разблокированы. Кроме того, поскольку 'reloadData' не имеет анимации, он даст эффект« привязки ». – Firo

+0

моя логика заключалась в том, что ячейка переместилась бы наверх; то это сон задерживает reloadData 1 секунду. – Brian

ответ

1

Вы сначала скажете, что tableView ожидает обновления с beginUpdates. Затем обновите соответствующие разделы (если ваш tableView имеет только один раздел, а затем просто пропустите нуль для номера раздела). Здесь вы указываете анимацию - вы можете поиграть с ней, чтобы получить необходимый эффект. После этого вы вызываете endUpdates на tableView. ЬурейеЕ для UITableViewRowAnimation определяет:

typedef enum { 
    UITableViewRowAnimationFade, 
    UITableViewRowAnimationRight, 
    UITableViewRowAnimationLeft, 
    UITableViewRowAnimationTop, 
    UITableViewRowAnimationBottom, 
    UITableViewRowAnimationNone, 
    UITableViewRowAnimationMiddle, 
    UITableViewRowAnimationAutomatic = 100 
} UITableViewRowAnimation; 

Play вокруг, чтобы увидеть, какой вы хотите. Даже выбор UITableViewRowAnimationNone может иметь приятный эффект. В зависимости от того, сколько разделов у вас есть вы можете использовать - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation

Таблицы коды обновления ниже:

[self.tableView beginUpdates]; 
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 
+0

@brain Если вы найдете какие-либо ответы полезными, пожалуйста, ** повысите его **, и если ответ правильный, то пожалуйста ** принять его ** это поможет удалить вопрос из списка ** без ответа. * – icodebuster

0

Попробуйте это:

[self.tableView beginUpdates]; 
[self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:origIndexPath 
                 inSection:0]] 
       withRowAnimation:UITableViewRowAnimationAutomatic]; 
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 
                 inSection:0]] 
       withRowAnimation:UITableViewRowAnimationAutomatic]; 
[self.tableView endUpdates]; 
+2

И, как упоминалось выше, не используйте sleep(). Я запрещаю! :) –

+0

даже настройка с помощью RowAnimation: для чего-то еще, это действительно не проблема. Это предотвращает странную привязку/мерцание, но клетки мгновенно появляются сверху без анимации. :/ – Brian

1

решаемым.

 [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(briefPause) userInfo:nil repeats:NO]; 

я использовал выше в том же способом, как

[self.tableView beginUpdates] 
.... 

но я сделал новую функцию, briefPause которая является просто:

[self.tableView reloadData]; 
+0

Это действительно работает, но я бы рекомендовал использовать меньше времени: [NSTimer scheduleTimerWithTimeInterval: 0.2 target: self selector: @selector (shortPause) userInfo: nil repeatats: NO]; Он по-прежнему будет работать, но выглядит более гладко – Renexandro

Смежные вопросы