动画结束后执行代码的最佳方法是什么(例如,在淡出后从超视图中删除视图)?我看到setAnimationDidStopSelector:
但不确定如何使用它。
答案 0 :(得分:13)
这很简单。你必须定义像
这样的方法-(void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
//do smth
}
然后致电
[UIView beginAnimations: nil context: nil];
[UIView setAnimationDelegate: self]; //or some other object that has necessary method
[UIView setAnimationDidStopSelector: @selector(animationDidStop:finished:context:)];
您可以发布要删除的视图。为此你必须这样做:
[UIView beginAnimations: nil context: someView];
然后添加回调:
-(void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
[(UIView*)context removeFromSuperView];
}
答案 1 :(得分:0)
我这样做的标签我想翻转。它启动一个动画但后来想在第一个完成后启动另一个动画。对于你的问题,你可以释放并释放不再需要的东西,而不是开始另一个动画。
- (void) doIt {
CGRect r = self.bounds;
// Save some context information for after the animation
struct contextStruct *c;
c = (struct contextStruct *) malloc( sizeof(struct contextStruct) );
c->oldHeight = r.size.height;
[UILabelThatFlips beginAnimations: @"flipMe" context: c];
[UILabelThatFlips setAnimationDelegate: self];
[UILabelThatFlips setAnimationDidStopSelector: @selector(animationDidStop:finished:context:)];
[UILabelThatFlips setAnimationDuration: 0.3];
[UILabelThatFlips setAnimationCurve: UIViewAnimationCurveEaseIn];
if( animation == UILabelAsButtonAnimationFlip ) {
r.size.height = 0.0;
self.bounds = r;
[UILabelThatFlips commitAnimations];
}
- (void) animationDidStop: (NSString *) animationID finished: (NSNumber *) finished context: (void *) context {
struct contextStruct *c = context;
CGRect r = self.bounds;
[UILabelThatFlips beginAnimations: @"flipBack" context: NULL];
[UILabelThatFlips setAnimationDelay: 0.08];
[UILabelThatFlips setAnimationDuration: 0.3];
[UILabelThatFlips setAnimationCurve: UIViewAnimationCurveEaseOut];
r.size.height = c->oldHeight;
self.bounds = r;
[UILabelThatFlips commitAnimations];
// Stop up any memory leaks
free( context );
}