Iphone 捕获已完成动画的UIPicker selectRow通知

Iphone 捕获已完成动画的UIPicker selectRow通知,iphone,events,animation,uiview,uipickerview,Iphone,Events,Animation,Uiview,Uipickerview,我试图捕捉特定的UIPicker动画何时完成 我一直在寻找这个问题的答案,但常见的答案似乎不起作用,即确保selectRow调用位于beginAnimations和Committeanimations调用中。 问题是,在调用commitAnimations之后,animationFinished几乎立即触发,而在实际动画停止之前很久。 考虑到问题可能是selectRow创建了自己的动画块,而我实际上并没有跟踪我想要的内容,我尝试调用带有动画的selectRow:不希望我自己的动画块会接管选择器的

我试图捕捉特定的UIPicker动画何时完成

我一直在寻找这个问题的答案,但常见的答案似乎不起作用,即确保selectRow调用位于beginAnimations和Committeanimations调用中。
问题是,在调用commitAnimations之后,animationFinished几乎立即触发,而在实际动画停止之前很久。
考虑到问题可能是selectRow创建了自己的动画块,而我实际上并没有跟踪我想要的内容,我尝试调用带有动画的selectRow:不希望我自己的动画块会接管选择器的动画。这确实使animationFinished在动画结束时触发,但动画本身变得急促

我如何确保我正在跟踪正确的动画,或者我遗漏了什么

任何信息,包括我可能错过的适当文档的简短参考,都将不胜感激

致以最良好的祝愿, M@

代码如下:

- (void) animationFinished:(NSString *)animationID finished:(BOOL)finished context:(void *)context {  
     NSLog(@"animation %d stopped",animationID);  
}  

- (void)animateToRow:(UIPickerView *)pickerView toRow:(NSInteger)row inComponent:(NSInteger)component
{

    [UIPickerView beginAnimations:@"1" context:nil];  
    [UIPickerView setAnimationDelegate:self];  
    [UIPickerView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];  
    [pickerView selectRow:row inComponent:component animated:YES];  
    [UIPickerView commitAnimations];  
}

你在正确的轨道上。在提供的代码中将自己设置为动画代理时,将自己设置为动画块的代理。因为您没有提供动画持续时间,所以didStopSelector将立即启动

没有一种“受支持”的方法可以做到这一点。几乎任何解决方案都不能保证将来兼容

毫无疑问,苹果正在用自己的动画块包装picker动画。您可以进行一些创造性的调试,确定动画的确切持续时间,并对动画块进行硬编码以匹配。一般来说,苹果的UIKit动画都是固定的,不管东西要走多远。(通常约为0.33秒)

我会试试这个。。。 -为UIView创建一个category方法,覆盖setAnimationDuration:并在此方法内设置断点。(在您准备好之前,最好禁用它,因为它会被大量调用。) -调用animateToRow:ToRow:Incomonent:方法时,打开断点,并观察拾取器视图动画块传递的值


像我说的那样设置一个分类方法将有效地消除为UIView动画块设置持续时间的能力,我不能保证不会有任何奇怪的副作用,而且它绝对只用于调试。

您的方法是正确的。在提供的代码中将自己设置为动画代理时,将自己设置为动画块的代理。因为您没有提供动画持续时间,所以didStopSelector将立即启动

没有一种“受支持”的方法可以做到这一点。几乎任何解决方案都不能保证将来兼容

毫无疑问,苹果正在用自己的动画块包装picker动画。您可以进行一些创造性的调试,确定动画的确切持续时间,并对动画块进行硬编码以匹配。一般来说,苹果的UIKit动画都是固定的,不管东西要走多远。(通常约为0.33秒)

我会试试这个。。。 -为UIView创建一个category方法,覆盖setAnimationDuration:并在此方法内设置断点。(在您准备好之前,最好禁用它,因为它会被大量调用。) -调用animateToRow:ToRow:Incomonent:方法时,打开断点,并观察拾取器视图动画块传递的值


像我说的那样设置分类方法将有效地消除为UIView动画块设置持续时间的能力,我不能保证不会有任何奇怪的副作用,而且它绝对只用于调试。

感谢您快速清晰的回答。虽然我一定会尝试这一点来满足我的好奇心,但它似乎有点太…不支持依赖于实际的应用商店产品。首先也是最重要的一点是,我的问题是确保我没有遗漏一个已知的模式或官方的API方法。如果没有其他人想出一个,而你是说没有,我将不得不找到一个不同的路径或重新考虑使用整个。顺致敬意,M@Thank谢谢你快速清晰的回答。虽然我一定会尝试这一点来满足我的好奇心,但它似乎有点太…不支持依赖于实际的应用商店产品。首先也是最重要的一点是,我的问题是确保我没有遗漏一个已知的模式或官方的API方法。如果没有其他人想出一个,而你是说没有,我将不得不找到一个不同的路径或重新考虑使用整个。向你问好,M@