如何知道UIView动画何时全部完成

时间:2014-02-18 12:18:47

标签: ios objective-c uiview core-animation caanimation

我创建的自定义视图正在通过其容器进行动画处理 - 在我看来,我使用其他动画更新部分子视图(例如UICOllectionView)

我发现这是在抛出错误

*** Assertion failure in -[UICollectionView _endItemAnimations

四处搜索我看到我的视图附有动画:

<GeneratorView: 0x15b45950; frame = (0 0; 320 199); animations = { position=<CABasicAnimation: 0x145540a0>; }; layer = <CALayer: 0x15b49410>>

所以现在在执行动画操作之前,我会检查:

NSArray *animationKeys = [self.layer animationKeys];
    for (NSString *key in animationKeys) {
        CAAnimation *animation = [self.layer animationForKey:key];

    }

我看到会返回动画对象:

此时我想“等待”,直到所有动画完成后才更新自己。

我看到我可以将自己添加为CAAnimation委托。

但这有点乱,难以追踪。

使用UIView方法是否有更简单的方法 - 更高级别?

2 个答案:

答案 0 :(得分:3)

您可以使用UIView方法在容器中执行动画:

[UIView animateWithDuration: animations: completion:];
[UIView animateWithDuration: delay: options: animations: completion:];

您应该向自定义视图添加属性:

@property BOOL isAnimating;

在容器中运行动画块并更改视图isAnimating属性。 此方法接受将在动画完成时触发的块。 例如:

[UIView animateWithDuration:1.0 animations:^{
        //Your animation block
        view1.isAnimating = YES;
        view1.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
        // etc.
    }completion:^(BOOL finished){
        view1.isAnimating = NO;
        NSLog(@"Animation completed.");
    }];

现在您可以查看视图是否为动画:

if (self.isAnimating)
    NSLog(@"view is animating");

答案 1 :(得分:0)

我认为你可以那样:

@interface UIView(UIViewAnimationWithBlocks)

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);

希望有所帮助