如何解决为什么在动画过程中引用CALayer父视图的属性为“ nil”
我一直试图保留对CALayer子类的父视图的引用,但是在动画制作过程中它变为nil,我想知道为什么。
为containerWidth
设置动画时,parentView
为零。
198.0648398399353
self.delegate: Optional(<Project.ContainerView: 0x7fc037a05370 ...
parentView: nil
在动画前后,parentView
不为零。
200.0
self.delegate: Optional(<Project.ContainerView: 0x7fc037a05370 ...
parentView: Optional(<Project.ContainerView: 0x7fc037a05370 ...
class ContainerLayer: CALayer {
var didSetup = false
var parentView: ContainerView!
@NSManaged var containerWidth: CGFloat
override func layoutSublayers() {
super.layoutSublayers()
if !self.didSetup {
parentView = self.delegate as? ContainerView
self.didSetup = true
}
}
override class func needsdisplay(forKey key: String) -> Bool {
if key == #keyPath(containerWidth) {
return true
}
return super.needsdisplay(forKey: key)
}
override func draw(in ctx: CGContext) {
print(containerWidth)
print("self.delegate: \(self.delegate)")
print("parentView: \(parentView)")
}
}
解决方法
在动画过程中,将复制图层,并且整个动画将显示在复制的图层实例上。
通过这种方式CoreAnimation
在两个状态(模型状态和表示状态)之间有所不同。在presentationLayer
上渲染您使用的图层,带有模型状态以及动画。
表示层是通过init(layer: Any)
初始化程序创建的,其中layer
参数是模型层。
您可以在此初始化程序中将所需的属性从模型层分配给表示层,如下所示:
class ContainerLayer: CALayer {
private override init(layer: Any) {
super.init(layer: layer)
if let containerModelLayer = layer as? ContainerLayer {
self.parentView = containerModelLayer.parentView
}
}
...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。