我想在特定的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];
}
答案 0 :(得分:1)
你走在正确的轨道上。当您在自己提供的代码中将自己设置为动画委托时,您将自己设置为动画块的委托。因为您没有提供动画持续时间,所以您的didStopSelector将立即触发。
没有“支持”的方式来做到这一点。几乎任何解决方案都无法保证未来的兼容性。
毫无疑问,Apple正在将选择器动画包装在它自己的动画块中。您可以进行一些创意调试并确定动画的确切持续时间,并对动画块进行硬编码以匹配。一般来说,Apple的UIKit动画具有固定的持续时间,无论距离有多远。 (通常,它大概是.33秒)。我会试试这个...... - 为UIView创建一个类别方法,并覆盖setAnimationDuration:并在此方法中设置断点。 (最好在你做好准备之前禁用它,因为它会被称为压倒性的次数。) - 当调用animateToRow:torRow:inComponent:方法时,打开断点,并观察选择器视图动画块传递的值。
像我说的设置类别方法将有效地消除为UIView动画块设置持续时间的能力,我不能保证不会有任何奇怪的副作用,并且它绝对只用于调试。