如何在视图的直接层上启用动画?

How do you enable animation on a view's direct layer?

当我更改视图图层的背景颜色时,它会立即更改并且不会像子图层那样设置动画。是什么禁用了它?

class MyView: UIView {

    var mySublayer = CALayer()

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override init(frame: CGRect) {
        super.init(frame: frame)

        layer.addSublayer(mySublayer)
        mySublayer.frame = bounds
    }
}

let view = MyView()

view.layer.backgroundColor = UIColor.red.cgColor // this changes the background color instantly

view.mySublayer.backgroundColor = UIColor.red.cgColor // this animates to the new color

那么是什么导致视图的直接层无法将其背景颜色设置为新颜色?

您可以使用

更改带有动画块的 ViewController 视图的背景颜色
    UIView.animate(withDuration: 10) {
        self.view.layer.backgroundColor = UIColor.green.cgColor
        //or you can use
        //self.view.backgroundColor = UIColor.green 
    }

阅读 Animations 以找到视图的动画属性。

在 iOS 中,所有视图都是图层支持的,因此您可以随时更改图层的属性,这将影响与其关联的视图。

编辑 1:

即使在提供了上面的答案之后,OP 似乎仍然很困惑,所以添加更多信息以使其更容易理解。

您的代码中似乎有几个问题。

问题 1:

var mySublayer = CALayer()

创建 CALayer 帧 (0,0,0,0)。您需要设置 CALyer 的框架。虽然我不明白你想用 mySublayer 做什么,但在目前的状态下它没有用。动画化 mySublayer 的背景颜色无论如何都无济于事,因为它的框架是 (0,0,0,0)

你问哪里设置它的边框最好!你可以使用

override func layoutSubviews() {
    super.layoutSubviews()
    self.someLayer.frame = self.frame
}

问题 2:

view.layer.backgroundColor = UIColor.red.cgColor

上面的语句不会动画化图层背景颜色值的变化属性。我已经在上面的回答中展示了它,你将不得不使用 UIView.animate 来为视图 属性 的值的变化设置动画,否则你可以使用像 CABasicAnimation 这样的核心动画 API。

只需将值设置为 View 的 属性 即可立即更新 View 的 属性,但不会对其进行动画处理

所以最后,如果你想动画化视图的 属性 值的变化,你将不得不使用 UIView.animate,如下所示。

let view = MyView()

 UIView.animate(withDuration: 10) {
     view.layer.backgroundColor = UIColor.red.cgColor
     view.mySublayer.backgroundColor = UIColor.red.cgColor
 }

希望对您有所帮助