首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS animateWithDuration立即完成隐藏/显示,甚至不透明

iOS animateWithDuration立即完成隐藏/显示,甚至不透明
EN

Stack Overflow用户
提问于 2014-10-26 17:17:23
回答 2查看 935关注 0票数 4

我想让我的CALayer动画显示一段时间,然后淡出,这是我的代码

代码语言:javascript
运行
复制
[_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);
    }];
}];

然而,动画并没有像我预期的那样工作,所有的东西几乎都完成了。

代码语言:javascript
运行
复制
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发送一条消息,然后我在屏幕上显示消息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-26 17:38:01

问题是UIView动画是用于动画视图的。

对使用UIView动画时所发生的事情的高度概述是,块被执行,这会改变视图的属性,而视图属性反过来又会更改支持层(或直接更改层属性)。当(支持)层的属性发生变化时,它会要求它的委托(如果该层支持一个视图,它总是视图)为该动画提供一个操作。然后,视图可以检查动画块内部是否发生了更改。如果更改发生在动画块内部,则视图将返回具有正确持续时间、时间曲线等的动画。

但是,对于没有附加到一个层的视图,没有委托可以询问。相反,该层继续寻找“动作”(动画的一个更通用的术语),并最终选择该层类的默认操作。-actionForKey:方法在CALayer上概述了这种行为。

默认操作几乎总是(路径的动画是一个例外),一个0.25秒长的基本动画。这就是你看到的动画。层实际上是在默认情况下动画化他们的更改(禁用它是一种视图行为),因此您将从动画块内部的更改和动画块外部的表单中看到此动画。

如果您想阅读更多关于这方面的内容:

我在这里的objc.io文章的前三分之一更详细地解释了视图和层之间的交互。我还有一篇博文,它解释了隐式动画和显式动画之间的区别。

以上解释了你为什么会看到这种行为。要“修复”它,您可以转到更高的抽象中,使用视图而不是层,或者自己创建动画对象并将它们添加到该层( UIKit在视图级别所做的工作)。

票数 6
EN

Stack Overflow用户

发布于 2014-10-26 17:35:26

探索核心动画和堆栈溢出,你应该尝试使用2层,这将帮助你淡入和淡出。我试图解决类似的问题,下面的答案对我有帮助。

小代码示例:

此代码基于答案。

代码语言:javascript
运行
复制
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];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26575718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档