UIView.layoutSublayersof :)中的layer参数是否始终是视图的图层?

问题描述

在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中实现,无需程序员干预)是否也可以同时成为另一层的委托。