动画后,查看位置重置

时间:2008-10-22 16:23:41

标签: iphone cocoa-touch core-animation

我正在尝试从上到下制作视图幻灯片。这不是什么大问题,我使用了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委托,并且视图消失了,显然这很糟糕。我做错了什么?

6 个答案:

答案 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];

我发现我很难找到正确的方法来访问属性的属性。