2011-03-12 2 views
1

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

В 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]; 

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

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

Заранее благодарим за помощь.

ответ

5

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

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

+0

Блестящий! Так оно и было. Самое приятное в том, что делать это блочным способом - это блокировать автоматическое сохранение представлений извне, поэтому вам не нужно беспокоиться о том, чтобы вручную убедиться, что временные представления не будут уничтожены до того, как вызывается обработчик завершения. Также дает вам сомнительное удовлетворение, сделав это официально рекомендованным способом :) – glenc

+0

Пять лет спустя, и вы все равно сохранили мой день. Спасибо! –

1

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

[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]; 

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

+0

Привет - Большое спасибо за это, это действительно работает и дает мне желаемое поведение. Я хотел бы знать, почему метод блочной анимации не работает, поскольку теперь это рекомендуемый способ делать вещи. – glenc

+0

Действительно, это рекомендуемый способ сейчас? Единственная причина, по которой я могу думать о том, почему это не будет работать с блочным методом, заключается в том, что блочный метод не создает новый поток, тогда как этот метод создает новый поток, и вся работа выполняется в этом другом потоке. Возможно, они установили это как поведение по умолчанию, чтобы экономить на ресурсах, потому что большинству людей не нужно было включать взаимодействие во время анимации, а для тех немногих, которые это делают, вы можете использовать этот метод. Просто мои спекуляции. – Omar

+0

В соответствии с документацией для '[UIView beginAnimations: context:]' этот способ сделать это больше не рекомендуется (если для вашего приложения требуется как минимум iOS 4.0): http://developer.apple.com/library/ios/ # documentation/uikit/reference/UIView_Class/UIView/UIView.html # // apple_ref/doc/uid/TP40006816-CH3-SW14 – glenc

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