如何知道 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 动画何时全部完成的主要内容,如果未能解决你的问题,请参考以下文章