如何禁用CALayer隐式动画?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (270)

这让我疯狂!我正在制作绘图应用程序。假设我正在制作一张UIView名片。

我在这个视图([sheet.layer addSublayer:...])中添加了一些子图层然后我想要绘制它们。为此,我正在创建一个CGImageRef并将其放入图层中contents。但它是动画的,我不希望这样。

我尝试了一切:

  • removeAnimationForKey:
  • removeAllAnimations
  • 设置动作字典
  • 使用动作层 delegate
  • [CATransaction setDisableAnimations:YES]

这似乎是正确的。我不明白为什么这个图层仍然是动画的; _; 难道我做错了什么?有秘密的方式吗?

提问于
用户回答回答于

从Mac OS X 10.6和iOS 3开始,CATransaction还有一个setDisableActions设置key值的方法kCATransactionDisableActions

[CATransaction begin];
[CATransaction setDisableActions:YES];

layer.content = someImageRef;

[CATransaction commit];

在Swift中,我喜欢使用这种扩展方法:

extension CATransaction {
    class func withDisabledActions<T>(_ body: () throws -> T) rethrows -> T {
        CATransaction.begin()
        CATransaction.setDisableActions(true)
        defer {
            CATransaction.commit()
        }
        return try body()
    }
}

然后你可以像这样使用它:

CATransaction.withDisabledActions {
    // your stuff here
}
用户回答回答于

其他方式:

  1. 您应该禁用sheet.layer的默认动画,在添加子图层时会隐式调用它。
  2. 您还应该对每个子图层进行内容动画处理。当然,每次设置sublayer.content时都可以使用CATransaction的“kCATransactionDisableActions”。但是,您可以在创建子图层时禁用此动画一次。

这是代码:

// disable animation of container
sheet.layer.actions = [NSDictionary dictionaryWithObject:[NSNull null] 
                                                  forKey:@"sublayers"];

// disable animation of each sublayer
sublayer.layer.actions = [NSDictionary dictionaryWithObject:[NSNull null] 
                                                     forKey:@"content"];

// maybe, you'll also have to disable "onOrderIn"-action of each sublayer.       

扫码关注云+社区

领取腾讯云代金券