Languages/Objective-C2011.01.04 14:19

[UIView beginAnimation]

이거 써서 애니메이션 효과 넣으신 분들 많으시죠. iOS 4.0 부터는 블럭 기반 문법을 사용하는 API를 사용하도록 하라는 권고안이 날아오는 바람에 앞으로는 사용하기 좀 껄끄러워 질 것 같긴 합니다만, 그럼에도 여전히 많이 쓰이고 있습니다.
 
기본적으로 이 계열 API는 다음과 같이 사용하는데요.

gameCenter.frame = before;
[self.view addSubview:gameCenter];
[UIView beginAnimations:nil context:nil];
gameCenter.frame = after;
[UIView commitAnimations];


이렇게 하면 gameCenter의 프레임 위치가 움직이는 것이 애니메이션 형태로 표현되죠.

그런데 이렇게 프로그래밍 해 본 분들이면 대충 아시겠습니다만, commitAnimations 한 다음에 [gameCenter removeFromSuperview] 한다거나 [gameCenter release] 하면 애니메이션 효과가 제대로 먹질 않는 경우가 많아요. 애니메이션이 끝나기도 전에 뷰가 화면에서 사라지기 때문이죠.

이를 방지하기 위해서는 다음과 같이 해야 합니다.
(아마 대충 다 아시겠습니다만... ㅎ)

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(clearGameCenter)];
gameCenter.frame = after;
[UIView commitAnimations];
 
 
그러니까 애니메이션이 끝난 다음에 호출될 메소드와 그 메소드가 정의되어 있는 객체를 넘기는 것이죠. 후자의 작업은 setAnimationDelegate를 통해서 하고, 전자의 작업은 setAnimationDidStopSelector를 통해서 합니다.
 
그러니까 애니메이션이 끝난 다음에 gameCenter UIView를 화면에서 지워버리고 싶다면, clearGameCenter 메소드 안에서 다음과 같이 하면 됩니다.
 
- (void) clearGameCenter {
    [gameCenter removeFromSuperview];
    [gameCenter release];
    gameCenter = nil;
}
 
간단하죠. 이런 일들이 iOS 4.0 이상에서는 좀 더 간단해 질 터인데, 그에 관해서는 제가 XCode를 업그레이드 한 다음에 살펴보도록 하겠습니다. ㅎㅎ
 

[다음에 계속]


신고
Posted by 이병준

소중한 의견, 감사합니다. ^^