Невозможно взаимодействовать с UITableView во время анимации - PullRequest
1 голос
/ 12 марта 2011

Я пытаюсь реализовать анимацию, которая происходит, когда пользователь касается одной из моих ячеек таблицы. По сути, анимация - это просто небольшая метка с текстом, подобным «+5» или «+1», который появляется, а затем перемещается вверх во время исчезновения (в основном, как очки появляются в видеоиграх, когда пользователь их забивает).

В реализации tableView:didSelectRowAtIndexPath: моего контроллера я делаю следующее (перефразировано для простоты здесь):

CGRect toastFrame = /* figure out the frame from the cell frame here */;
UILabel *toast = [[UILabel alloc] initWithFrame:toastFrame];
toast.text = [NSString stringWithFormat:@"+%d", 5];
toast.backgroundColor = [UIColor clearColor];
toast.userInteractionEnabled = NO; // hoped this would work but it doesn't
[tableView addSubview:toast];

[UIView
 animateWithDuration:1.0
 animations:^
 {
     toast.alpha = 0.0;
     toast.transform = CGAffineTransformMakeTranslation( 0.0, -44.0 );
 }
 completion:^ (BOOL finished)
 {
     [toast removeFromSuperview];
 }];

[toast release];

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

Есть ли способ предотвратить это и позволить пользователю продолжать взаимодействовать с табличным представлением, как если бы анимация вообще не происходила?

Заранее спасибо за любую помощь в этом.

Ответы [ 2 ]

6 голосов
/ 13 марта 2011

Другим вариантом может быть использование animateWithDuration:delay:options:animations:completion: (не проверено, с макушки головы)

Посмотрите на параметр options и возможные флаги, определенные как UIViewAnimationOptions. В комплекте есть флаг под названием UIViewAnimationOptionAllowUserInteraction. Это может быть решением, может быть, вам стоит попробовать!

1 голос
/ 12 марта 2011

Вы пытались сделать это по-другому?Например, после добавления тоста в качестве подпредставления вы можете сделать что-то вроде этого:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve: UIViewAnimationCurveEaseOut];
[UIView setAnimationDuration: 1.0];
toast.alpha = 0.0;
toast.frame.origin.y -= 44.0;
[toast performSelector:@selector(removeFromSuperview) withObject: nil afterDelay: 1.0];
[UIView commitAnimations];

и затем выпустить тост.Вы можете попробовать это так и посмотреть, работает ли оно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...