我创建的自定义视图正在通过其容器进行动画处理 - 在我看来,我使用其他动画更新部分子视图(例如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方法是否有更简单的方法 - 更高级别?
答案 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);
希望有所帮助