【问题标题】:Stopping core animation on layer when some condition is met满足某些条件时停止图层上的核心动画
【发布时间】:2013-11-12 21:25:11
【问题描述】:

我正在尝试制作 2 个同时开始并使用相同曲线的核心动画,但如果满足条件,则需要停止其中一个。例如。我在左边有以下视图,想过渡到右边。

红色视图可以被视为黄色视图之上的叠加层,即使一开始它们并不相交。想象一下点击“第 3 项”。我需要做的是将所有行移动到顶部的动画距离-item3.frame.origin.y 但是一旦title3 到达屏幕顶部,它应该保持在那里,所以剩余的item1 item2 看起来就像他们在后面滑动title3

我尝试使用带有选项的核心动画为所有元素设置动画:UIViewAnimationsOptionLayoutSubviews,然后在layoutSubview 中使用以下代码停止动画:

-(void)layoutSubviews {
    CALayer* presentationLayer = (CALayer*)[self.title3.layer presentationLayer];
    if (presentationLayer.frame.origin.y <= 0) {
        [self.title3.layer removeAllAnimations];
    }
}

但没有任何成功。有没有办法让它使用核心动画而不用 CADisplayLink 模拟。我不能使用两个单独的动画,因为很难计算 title3 动画的持续时间,如果动画曲线不是线性的,这会在 title3 和 title2 之间产生间隙。

【问题讨论】:

    标签: ios iphone animation core-animation


    【解决方案1】:

    您可以根据苹果技术说明QA1673通过以下代码实现暂停/开始图层动画功能:

    -(void)pauseLayer:(CALayer*)layer
    {
        CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
        layer.speed = 0.0;
        layer.timeOffset = pausedTime;
    }
    
    -(void)resumeLayer:(CALayer*)layer
    {
        CFTimeInterval pausedTime = [layer timeOffset];
        layer.speed = 1.0;
        layer.timeOffset = 0.0;
        layer.beginTime = 0.0;
        CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
        layer.beginTime = timeSincePause;
    }
    

    【讨论】:

    • 我应该详细说明,我在检测我的视图 origin.y 是否在动画时处于顶部时遇到了主要问题。即使我正在检查presentationLayer,它看起来像在第一帧origin.y 属性设置为动画完成后应该设置的最终值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多