2008-10-22 118 views
27

我想从上到下制作一个视图幻灯片。这不是什么大问题,我用这个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委托,视图消失,显然这是可怕的。我究竟做错了什么?

回答

15

那么,根据苹果示例“MoveMe”,这(removedOnCompletion)应该工作,但是,它似乎并不。

所以,你的代码之后添加这些行:

 
[self.view.layer addAnimation:animation forKey:@"moveX"]; 
self.view.layer.position = [animation.toValue CGPointValue]; 

这确保了动画运行后,该层的正确定位。

+0

为什么我没有看到?谢谢,这解决了我的问题。我认为这是一个错误,我不应该这样做,但至少它是有效的。 – carlos 2008-10-23 00:45:07

-2

你可以将视图的隐藏属性设置为YES吗?

我认为这将是:

self.view.hidden = YES; 

但它可能是:

[self.view setHidden:YES]; 

我原来我在搞清楚访问性能的特性的正确方法相当跛脚。

+0

我这样做,但我得到了同样的结果。 – carlos 2008-10-22 20:24:57

+0

完全一样。 – Ricardo 2016-04-12 10:03:03

0

设置视图隐藏为Rob建议应该这样做。

对于属性的属性,我会坚持像你已经在你的代码中的ObjC 2.0风格。

set.view.hidden = YES; 
0

这也是我的一点点。您想要将动画的removedOnCompletion标志设置为NO。它默认为YES,这意味着动画完成后,它被删除,视图恢复到初始状态。

+0

同样在这里,我试过这个和相同的结果。当他们按下按钮时,我从相同的角度调用此代码。 – carlos 2008-10-22 20:25:46

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 
    } 
} 
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];