动画时设置属性两次

时间:2011-07-13 19:21:06

标签: iphone ios uiview uiviewanimation

如果我在动画块内部将属性设置两次到两个不同的值,会发生什么?如果我执行以下伪代码:

myView.frame = CGRectMake(0,  0, 50, 50); // state 0
[UIView beginAnimations:@"showBanner" context:NULL];
{
    [UIView setAnimationDuration:2];
    myView.frame = CGRectMake(0, 20, 50, 50); // state 1
    myView.frame = CGRectMake(0, 10, 50, 50); // state 2
}
[UIView commitAnimations];

我应该得到以下哪些结果?

  1. 帧从状态0到状态1动画到状态2.
  2. 帧从状态0直接动画到状态2,忽略状态1.
  3. 我希望结果#2发生,因为我认为在提交动画时会记录属性的状态。我在我的应用程序中得到一个行为,似乎表明结果#1正在发生,因此我的问题。

3 个答案:

答案 0 :(得分:1)

(2)帧从状态0直接动画到状态2,忽略状态1.

答案 1 :(得分:1)

实际上答案是3.以上都不是。

动画块仅为该属性的最后一次状态更改设置动画。因此,在您的情况下,框架将从状态1动画到状态2。

答案 2 :(得分:0)

我需要回答这个问题,并且没有发现这里给出的任何一个都令人满意。我建立了一个快速测试,放置了一个像这样的小子视图:

- (void)viewDidLoad {

    [super viewDidLoad];

    self.testView = [[UIView alloc] initWithFrame:CGRectMake(0,0,40,40)];
    self.testView.backgroundColor = [UIColor redColor];
    [self.view addSubview:self.testView];
}

然后提供了两个替代动画:

- (void)animateWithSimpleBlock {

    [UIView animateWithDuration:2 animations:^{
        self.testView.frame = CGRectMake(200,200,40,40);
        self.testView.frame = CGRectMake(  0,300,40,40); 
    }];
}

- (void)animateWithQualifiedBlock {

    [UIView animateWithDuration:2 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        self.testView.frame = CGRectMake(200,200,40,40);
        self.testView.frame = CGRectMake(  0,300,40,40); 
    }];
}

以下是发生的情况:在animateWithSimpleBlock上,testView从单个帧(无动画)跳转到它的初始0,0位置到中间位置200,200。从那里开始,它会在2秒内动画到最终的0,300位置。

但是animateWithQualifiedBlock可以将testView平滑地从它的初始0,0位置动画到最终的0,300位置。这是我需要的行为(b / c我用动画块中调用的循环方法构建新的视图位置)。