我想让我的CALayer动画显示一段时间,然后淡出,这是我的代码
[_msgLayer removeAllAnimations];
[UIView animateWithDuration:10 delay:0 options:0 animations:^ {
_msgLayer.hidden = false;
NSLog(@"showing");
} completion:^(BOOL finished) {
NSLog(@"showing done, finished=%d", finished);
[UIView animateWithDuration:10 delay:40 options:0 animations:^ {
_msgLayer.hidden = true;
} completion:^(BOOL hideFinished) {
NSLog(@"hiding done, finished=%d", hideFinished);
}];
}];然而,动画并没有像我预期的那样工作,所有的东西几乎都完成了。
2014-10-26 10:11:28.249 Foobar[91761:6827358] showing
2014-10-26 10:11:28.254 Foobar[91761:6827358] showing done, finished=1
2014-10-26 10:11:28.255 Foobar[91761:6827358] hiding done, finished=1我看到了一些类似的问题,有人说hidden是不可动的,但文件说它是可动的。而我也尝试了opacity,然后同样的结果,动画仍然立即完成。为什么会这样呢?我该怎么解决呢?
_msgLayer是我自己的类,继承了CALayer,它有自己的绘图方法。这个动画是从网络事件中调用的,就像服务器向iPhone发送一条消息,然后我在屏幕上显示消息。
发布于 2014-10-26 17:38:01
问题是UIView动画是用于动画视图的。
对使用UIView动画时所发生的事情的高度概述是,块被执行,这会改变视图的属性,而视图属性反过来又会更改支持层(或直接更改层属性)。当(支持)层的属性发生变化时,它会要求它的委托(如果该层支持一个视图,它总是视图)为该动画提供一个操作。然后,视图可以检查动画块内部是否发生了更改。如果更改发生在动画块内部,则视图将返回具有正确持续时间、时间曲线等的动画。
但是,对于没有附加到一个层的视图,没有委托可以询问。相反,该层继续寻找“动作”(动画的一个更通用的术语),并最终选择该层类的默认操作。-actionForKey:方法在CALayer上概述了这种行为。
默认操作几乎总是(路径的动画是一个例外),一个0.25秒长的基本动画。这就是你看到的动画。层实际上是在默认情况下动画化他们的更改(禁用它是一种视图行为),因此您将从动画块内部的更改和动画块外部的表单中看到此动画。
如果您想阅读更多关于这方面的内容:
我在这里的objc.io文章的前三分之一更详细地解释了视图和层之间的交互。我还有一篇博文,它解释了隐式动画和显式动画之间的区别。
以上解释了你为什么会看到这种行为。要“修复”它,您可以转到更高的抽象中,使用视图而不是层,或者自己创建动画对象并将它们添加到该层( UIKit在视图级别所做的工作)。
发布于 2014-10-26 17:35:26
探索核心动画和堆栈溢出,你应该尝试使用2层,这将帮助你淡入和淡出。我试图解决类似的问题,下面的答案对我有帮助。
小代码示例:
此代码基于这答案。
CALayer *parentLayer = [CALayer layer];
CALayer *animtingLayer = [CALayer layer];
//FADE IN
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
animation.beginTime = CMTimeGetSeconds(img.startTime);
animation.duration = CMTimeGetSeconds(_timeline.transitionDuration);
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat:1.0f];
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeBoth;
animation.additive = NO;
[parentLayer addAnimation:animation forKey:@"opacityIN"];
//FADE OUT
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
animation.beginTime = CMTimeGetSeconds(CMTimeAdd(img.passTimeRange.start, img.passTimeRange.duration));
animation.duration = CMTimeGetSeconds(_timeline.transitionDuration);
animation.fromValue = [NSNumber numberWithFloat:1.0f];
animation.toValue = [NSNumber numberWithFloat:0.0f];
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeBoth;
animation.additive = NO;
[animtingLayer addAnimation:animation forKey:@"opacityOUT"];
[parentLayer addSublayer:animtingLayer];https://stackoverflow.com/questions/26575718
复制相似问题