我正在尝试从上到下制作视图幻灯片。这不是什么大问题,我使用了CABasicAnimation
。问题是当我想删除视图时。我用这个动画。
CABasicAnimation *animation;
animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setDelegate:self];
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(self.view.layer.position.x, 0 - self.view.bounds.size.height / 2)];
animation.fromValue = [NSValue valueWithCGPoint:self.view.layer.position];
animation.autoreverses = NO;
animation.repeatCount = 0;
animation.duration = 0.25;
animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
[self.view.layer addAnimation:animation forKey:@"moveX"];
完美地激活了视图。但是,在动画结束后,我的视图再次出现。所以我添加了这一行:
[self.view removeFromSuperview];
删除视图,但没有动画。所以我决定将删除代码添加到此委托:
-(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag
现在,动画工作,视图消失,但有时,我可以看到视图出现并消失得更快,就像在动画之后,视图出现,然后调用animationDidStop
委托,并且视图消失了,显然这很糟糕。我做错了什么?
答案 0 :(得分:66)
可能想要设置这些属性。它们会导致在动画结束时保留演示文稿。
animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;
然后可以使用“animationDidStop:”方法删除动画结尾处的视图:
-(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag {
if (animation == [containerView.layer animationForKey:@"moveX"]) {
// remove view here, add another view and/or start another transition
}
}
答案 1 :(得分:15)
嗯,根据Apple示例“MoveMe”,这个( removedOnCompletion )应该可以工作,但是,它似乎没有。
所以,在代码后添加以下行:
[self.view.layer addAnimation:animation forKey:@"moveX"];
self.view.layer.position = [animation.toValue CGPointValue];
这可确保在动画运行后,图层已正确定位。
答案 2 :(得分:3)
在动画组中执行多个动画时遇到此问题。我不得不在动画组本身设置一些属性,而不是单独的动画。
CAAnimationGroup *animGroup = [CAAnimationGroup animation];
// MAKE SURE YOU HAVE THESE TWO LINES.
animGroup.removedOnCompletion = NO;
animGroup.fillMode = kCAFillModeForwards;
animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, nil];
animGroup.duration = tAnimationDuration;
[tImageView.layer addAnimation:animGroup forKey:nil];
答案 3 :(得分:0)
将视图设置为隐藏,因为Rob建议应该这样做。
对于属性的属性,我会坚持使用ObjC 2.0样式,就像你已经在代码中一样。
set.view.hidden = YES;
答案 4 :(得分:0)
这也是我的一点。您想要将动画的removedOnCompletion标志设置为NO。它默认为YES,这意味着在动画完成后,它将被删除,并且视图将恢复为其初始状态。
答案 5 :(得分:-2)
您可以将视图的隐藏属性设置为YES吗?
我认为会是:
self.view.hidden = YES;
但它可能是:
[self.view setHidden:YES];
我发现我很难找到正确的方法来访问属性的属性。