当我更改视图图层的背景颜色时,它会立即改变,并且不像子图层那样动画。是什么禁用了这个?
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
那么是什么导致视图的直接图层没有将它的背景颜色设置为新颜色?
答案 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
}
希望有所帮助