Jan*_*ser 0 macos presentation-layer calayer appkit swift
我正在使用CALayers,我希望在动画运行时检索有关图层子图层状态的一些信息.现在我知道我可以通过调用mySublayer.presentation()和访问返回图层的属性来从子层的表示层中检索信息.
但是,返回值是一个可选值,并且确实nil相对经常返回.在我的特定情况下,调用发生在layoutSublayers()我的图层内部(图层的超级图层,我想要的信息).
这就是为什么我想知道:一个图层何时有一个表示层,什么时候没有一个?不幸的是,我在Apple的文档中找不到任何相关内容.
非常感谢!
图层何时具有表示层
当它是渲染树的一部分时.图层始终作为其表示层在屏幕上呈现.
你得到的原因nil是你从早期看到的表示层layoutSublayers().这正是当层也不能有表示层; 我们正在第一次配置渲染树.
这里有一些测试代码可以告诉你发生了什么:
func delay(_ delay:Double, closure:@escaping ()->()) {
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}
class MyLayer : CALayer {
override func layoutSublayers() {
print("here1")
if let subs = self.sublayers {
for lay in subs {
print(lay.presentation() as Any)
}
}
super.layoutSublayers()
print("here2")
if let subs = self.sublayers {
for lay in subs {
print(lay.presentation() as Any)
}
}
}
}
class MyView : UIView {
override class var layerClass: AnyClass { return MyLayer.self }
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let lay = CALayer()
lay.backgroundColor = UIColor.black.cgColor
lay.frame = CGRect(x: 10, y: 10, width: 10, height: 10)
self.view.layer.addSublayer(lay)
print(lay.presentation() as Any)
delay(1) {
print(lay.presentation() as Any)
print("let's try rerendering")
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
}
}
}
Run Code Online (Sandbox Code Playgroud)
将视图控制器的视图设置为故事板中的MyView,然后启动.我们nil反复得到,直到我们delay接到电话.现在,图层是渲染树的一部分,因此现在和下一轮布局中,图层都有一个表示层.
另一个有趣的事情(作为读者的练习)是为图层设置动画.图层在动画期间获取不同的表示层,而在动画结束时获取另一个表示层.在与图层紧密配合时要牢记这一点非常重要; 它的表示层不是一个常量的单个对象 - 每次重新创建它时都会从原始层复制它.(男孩,在我意识到之前,我感到困惑.)
| 归档时间: |
|
| 查看次数: |
830 次 |
| 最近记录: |