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

Posted

技术标签:

【中文标题】如何知道 UIView 动画何时全部完成【英文标题】:How to know when UIView animations have all completed 【发布时间】:2014-02-18 12:18:47 【问题描述】:

我创建的自定义视图正在通过其容器进行动画处理 - 在我的视图中,我使用其他动画(例如 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 方法 - 更高级别?

【问题讨论】:

您使用哪种方法为视图设置动画? 我没有动画 - 容器是 - 我想知道我的视图(自我)何时没有动画 - 即如果(自我正在动画)等待它停止动画现在做一些动画; 我发布的问题中的动画是由其他一些对象执行的 - 在视图上 - 现在视图希望在这些动画完成后为其子视图设置动画 【参考方案1】:

你可以使用 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");

【讨论】:

【参考方案2】:

我想你能做到:

@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);

希望对你有所帮助

【讨论】:

以上是关于如何知道 UIView 动画何时全部完成的主要内容,如果未能解决你的问题,请参考以下文章

如何知道 UICollectionView 何时完成布局?

我如何知道用户何时到达 UITextView 中文本的末尾

UIView 可以知道它何时在屏幕上吗

在 UIView 生命周期中知道何时销毁视图

检测 iframe 何时开始加载新 URL

iOS 为视图设置模糊动画