2013-03-04 52 views
3

我只用了一点UIView动画和块,基本上是一步动画。我想将一些步骤叠加到一个序列中。下面的代码似乎正在工作,但我想知道这是否是正确的方法和/或是否存在将块放入块中的任何问题/限制。正确的方式来堆叠UIView动画和块?

尽管代码格式化有些笨拙/不可读,但块似乎很棒。

CGRect newFrame = CGRectMake(0, 0, 500, 500); 
UIView *flashView = [[UIView alloc] initWithFrame:newFrame]; 

flashView.tag = 999; 
[flashView setBackgroundColor:[UIColor grayColor]]; 
[flashView setAlpha:0.f]; 
[self.view addSubview:flashView]; 

[UIView animateWithDuration:.2f 
       animations:^{ 
        // STEP 1: FADE IN 
        [flashView setAlpha:1.f]; 
       } 
       completion:^(BOOL finished){ 
        [UIView animateWithDuration:.9f 
             animations:^{ 
              // STEP 2: FADE OUT 
              [flashView setAlpha:0.f]; 
             } 
             completion:^(BOOL finished){ 
              // STEP 3: CLEAN UP 
              [flashView removeFromSuperview]; 
             } 
         ]; 
       }]; 
+0

如果只修改一个视图,你可以看看['CAKeyframeAnimation'](https://developer.apple.com/library /mac/documentation/GraphicsImaging/Reference/CAKeyframeAnimation_class/Introduction/Introduction.html)。 – 2013-03-04 05:30:43

回答

1

你在做什么是正确的。有时候嵌套会变得丑陋。为便于阅读,一种选择是把每个动画在其自己的方法:

-(IBAction)someButtonPressed:(id)sender { 
    [self saveSomeData]; 
    [self fadeInAndOut]; 
} 

-(void)fadeInAndOut { 
    [UIView animateWithDuration:.2f 
        animations:^{ 
         // STEP 1: FADE IN 
         [self.flashView setAlpha:1.f]; 
        } 
        completion:[self fadeOut] 
    ]; 
} 

-(void (^)(BOOL))fadeOut { 
    return ^(BOOL finished) { 
     [UIView animateWithDuration:.9f 
         animations:^{ 
          // STEP 2: FADE OUT 
          [self.flashView setAlpha:0.f]; 
         } 
         completion:[self cleanUpFlashView] 
     ]; 
    }; 
} 

-(void (^)(BOOL))cleanUpFlashView { 
    return ^(BOOL finished){ 
     // STEP 3: CLEAN UP 
     [self.flashView removeFromSuperview]; 
    }; 
} 
1

这种方式并不可怕,如果你只是简单的代码嵌套一次。如果你要做更复杂的事情,你可以试试animateWithDuration:delay:options:animations:completion: 使用delay:作为链接动画的一种方法。例如:

[UIView animateWithDuration:.2f delay:0 
        options:UIViewAnimationOptionCurveEaseIn|UIViewAnimationOptionAllowUserInteraction 
       animations:^{ 
        // STEP 1: FADE IN 
        [flashView setAlpha:1.f]; 
       } 
       completion:nil 
]; 
[UIView animateWithDuration:.9f delay:.2f 
        options:UIViewAnimationOptionCurveEaseIn|UIViewAnimationOptionAllowUserInteraction 
       animations:^{ 
        // STEP 2: FADE OUT 
        [flashView setAlpha:0.f]; 
       } 
       completion:^(BOOL finished){ 
        // STEP 3: CLEAN UP 
        [flashView removeFromSuperview]; 
       } 
];