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

时间:2018-03-18 17:07:50

标签: ios cocoa-touch uiview core-animation calayer

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

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

那么是什么导致视图的直接图层没有将它的背景颜色设置为新颜色?

1 个答案:

答案 0 :(得分:1)

您可以使用

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

阅读Animations以查找View的可动画属性。

在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属性,但不会为其设置动画

最后,如果你想对view属性值的变化进行动画制作,你将不得不使用UIView.animate,如下所示。

let view = MyView()

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

希望有所帮助