ios - 堆叠 UIView 动画和 block 的正确方法?

标签 ios objective-c-blocks uiviewanimation

我只对 UIView 动画和 block 进行了一些研究,基本上是一步动画。我想将几个步骤堆叠成一个序列。下面的代码似乎有效,但我想知道这是否是正确的方法和/或在 block 内放置 block 是否存在任何问题/限制。

block 看起来很棒,尽管代码格式有点笨拙/不可读。

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];
                                      }
                      ];
                 }];

最佳答案

你所做的是正确的。有时嵌套会变得很丑陋。提高可读性的一种替代方法是将每个动画放入其自己的方法中:

-(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];
    };
}

关于ios - 堆叠 UIView 动画和 block 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15192631/

相关文章:

ios - 我如何在ios中从一个nib文件的两个 View 链接

iOS GCD 线程处理 - View Controller 已关闭

ios - UIView 动画完成 block 未被调用

ios - 你如何在动画 block 中返回一个值?

ios - 在 iOS 中拖动时如何修改 UIVisualEffectView 的模糊度?

ios - 从 UITableView/Feed 缩放 Facebook 应用程序风格的照片

ios - 如何为我的 CollectionView 单元格提供 onclick 功能?

ios - 在运行 App 时编辑单元格时更新数组

objective-c - 为什么这个 block 在它的描述符中没有复制和处置指针?

iOS 在 afnetworking 2.0 成功和失败 block 中设置属性时出现问题