问题描述
在UIView子类中覆盖layoutSublayers(of:)
时,我可以安全地假设传递给该方法的图层总是是UIView的图层吗?
如果是这样,这是否在文档的某个位置(我已经搜索过但未发现任何提及)?
要提供一些有关为什么我要问的上下文:在自定义UIView子类的CALayerDelegate方法layoutSublayers(of:)
的UIViews实现的重写中,检查该层是否是视图自身的层是否有意义,例如这个:
class FooView: UIView {
override func layoutSublayers(of layer: CALayer) {
guard layer === self.layer else { return }
}
}
或者由于苹果公司正式保证(除非我亲自更改),该检查是否多余(除非我亲自更改),否则视图将仅是其自身层的委托?
解决方法
layoutSublayers(of:)
不是UIView方法。这是CALayerDelegate方法,在图层的委托上调用。
好吧,您肯定可以保证UIView是其CALayer的委托,因为这是UIView及其CALayer的工作方式。如果不是这种情况,绘图将中断并且整个界面将停止工作。
但是,您不能保证UIView也不是 other 层的委托!这不会自己发生,但是您可以通过这种方式进行设置。但是,您实际上从来不会!在我的书中,我对此警告:
但是要小心!在任何情况下,都不要设置 not ,而将{em>是的UIView的基础层设置为
delegate
;并不使UIView成为其基础层以外的任何层的delegate
。 UIView 必须是其基础层的委托;此外,它必须不是任何 other 层的委托。 不要做任何事情来弄乱这件事。如果这样做,将会发生非常糟糕的事情;例如,绘图将无法正常工作。
是的,您可以认为有关的层是视图的层。
,上面写着in the official documentation of CALayer:
如果图层对象是由视图创建的,则该视图通常会自动将其自身分配为图层的委托,并且您不应更改该关系。
“通常”不是保证,但听起来很有可能UIView始终是其自己层的委托。不幸的是,这里没有说明UIView是否可以默认(即在UIKit中实现,无需程序员干预)是否也可以同时成为另一层的委托。