0

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

基本上,当某个事件发生时,我希望我的选择器视图能够动画自己选择它的最后一行(当然有动画),然后立即(没有任何进一步的用户交互)它的第一行(当然有动画)。我猜,这是为了给出一个“应用程序变得疯狂”的效果,这应该是非常机智的。

因此我的代码是:

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

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

我认为这可能是编译器的一些“聪明”功能,它指出以下两条指令执行对同一个变量的赋值,因此最好忽略第一个(不考虑“动画”因素)。我不知道是否是这种情况,但我试图根据某个参数的值在两个 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];

它没有工作:选择器仍然只执行第二个动作,它只会移动一次。

现在的问题是:

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

我怎样才能达到我的目标(即使可能有点微不足道)?

4

1 回答 1

2

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

只执行一个动画的原因是动画不是“立即”开始,而是在下一个运行循环中开始(更多关于哪个在这里)。此时动画将使用发送到选取器的最新值开始。

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

于 2010-02-19T12:04:33.373 回答