如何在视图的直接层上启用动画?
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
}
希望对您有所帮助
当我更改视图图层的背景颜色时,它会立即更改并且不会像子图层那样设置动画。是什么禁用了它?
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
}
希望对您有所帮助