懒惰UIPickerView - (它不会移动两次)

时间:2010-02-19 11:50:50

标签: objective-c iphone animation uipickerview

提前感谢您的关注。 我试图在我的简单应用程序中实现一点动画效果,这次使用UIPickerView对象。

基本上,当某个事件发生时,我希望我的选择器视图动画自己选择它的最后一行(当然是动画)和紧接着(没有任何进一步的用户交互)第一行(当然是动画) 。这个,给我一个“应用程序变得疯狂”的效果,我想这应该是非常诙谐的。

因此我的代码是:

[myPicker selectRow:[myPicker numberOfRowsInComponent:0]-1 inComponent:0 animated:YES];
[myPicker selectRow: 0 inComponent:0 animated:YES];

我得到的是,无论在其中指定的行,选择器都只执行第二条指令。它似乎忽略了第一个。

我认为这可能是编译器的一些“聪明”功能,它注意到两个跟随指令执行对同一变量的赋值,因此最好忽略第一个(不考虑'ANIMATED'因子)。 我不知道是不是这样,但我试图在两个if语句中基于某个参数的值移动这两个指令,试图这样欺骗编译器(在编译时无法知道该参数的值,因此它不应该执行这样的优化)。 它不起作用,因为我完全没有追踪,或者因为编译器比我聪明得多。 我甚至认为它可能是延迟和正确事件序列的问题,因此我尝试重写代码如下

-(void) setPickerRowToLastRow;
 {
     [myPicker selectRow:[myPicker numberOfRowsInComponent:0]-1 inComponent:0 animated:YES];
 }
 -(void) setPickerRowToFirstRow;
{
    [myPicker selectRow:0 inComponent:0 animated:YES];
}
                      .....
[self performSelector: @selector(setPickerRowToLastRow)
                     withObject: nil
                     afterDelay: 1];
[self performSelector: @selector(setPickerRowToFirstRow)
               withObject: nil
               afterDelay: 1];

它不起作用:选择器仍然只执行第二个动作,它只会移动一次。

现在的问题是:

为什么选择器只移动一次?

我如何达到目标(即使可能有点微不足道)?

1 个答案:

答案 0 :(得分:2)

这与编译器无关。这不是那么聪明。

仅执行一个动画的原因是动画不会“一次”启动,而是在下一个运行循环中启动(更多关于哪个here)。此时,动画将使用发送给选择器的最新值开始。

使用performSelector:withObject:afterDelay:应该可以工作,并且它不起作用的原因可能是你将1作为两次调用的延迟。在第一个上设置为0,在第二个上设置为2(例如),它应该可以工作。