捕获UIPicker selectRow完成动画的通知

时间:2010-08-23 15:46:13

标签: iphone events animation uiview uipickerview

我想在特定的UIPicker动画完成时抓住。

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

如何确保我正在追踪正确的动画,或者我错过了其他内容?

任何信息都将非常受欢迎,包括我可能错过的适当文档的简短引用。

祝你好运, 米@

这是代码:

- (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];  
}

1 个答案:

答案 0 :(得分:1)

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

没有“支持”的方式来做到这一点。几乎任何解决方案都无法保证未来的兼容性。

毫无疑问,Apple正在将选择器动画包装在它自己的动画块中。您可以进行一些创意调试并确定动画的确切持续时间,并对动画块进行硬编码以匹配。一般来说,Apple的UIKit动画具有固定的持续时间,无论距离有多远。 (通常,它大概是.33秒)。

我会试试这个...... - 为UIView创建一个类别方法,并覆盖setAnimationDuration:并在此方法中设置断点。 (最好在你做好准备之前禁用它,因为它会被称为压倒性的次数。) - 当调用animateToRow:torRow:inComponent:方法时,打开断点,并观察选择器视图动画块传递的值。

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