2011-03-12 5 views
1

사용자가 내 tableview 셀 중 하나를 누를 때 발생하는 애니메이션을 구현하려고합니다. 기본적으로 애니메이션은 나타나는 "+5"또는 "+1"과 같은 텍스트가있는 작은 레이블 일 뿐이며 페이딩 (기본적으로 사용자가 점수를 매기면서 포인트가 비디오 게임에 나타나는 것과 같은) 동안 위쪽으로 이동합니다. 내 컨트롤러의 tableView:didSelectRowAtIndexPath: 구현에서 애니메이션이 진행되는 동안 UITableView와 상호 작용할 수 없습니다.

, 나는이 (여기서는 편의상 의역) 다음 일을 해요 :

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에서 셀을 누른 후 1 초 동안 tableview에서 다른 셀을 누를 수 없습니다.

이런 일이 일어나지 않게하고 애니메이션이 전혀 일어나지 않는 것처럼 사용자가 계속 tableview와 상호 작용할 수있는 방법이 있습니까?

미리 감사드립니다.

답변

5

또 다른 옵션은

(내 머리의 상단에서, 검증되지 않은) animateWithDuration:delay:options:animations:completion: 사용 UIViewAnimationOptions에 의해 정의 된 options 매개 변수와 가능한 플래그를 살펴 보자 할 수 있습니다. 포함 된 플래그는 UIViewAnimationOptionAllowUserInteraction입니다. 이 일 수 있습니다. 어쩌면 시도해보십시오!

+0

Brilliant! 그랬어. 블럭 방식을 사용하는 것에 대한 좋은 점은 블록이 외부에서 뷰를 자동으로 유지하므로 완료 핸들러가 호출되기 전에 수동으로 임시 뷰가 삭제되지 않도록 걱정할 필요가 없다는 것입니다. 또한 공식적으로 권장되는 방법으로 당신에게 모호한 만족감을 줄 수 있습니다 :) – glenc

+0

5 년 후 당신은 여전히 ​​내 하루를 구했습니다. 고맙습니다! –

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

관련 문제