代码之家  ›  专栏  ›  技术社区  ›  aleclarson

CALayerDelegate显示层和NSView更新层有什么区别

  •  0
  • aleclarson  · 技术社区  · 5 年前

    [CALayerDelegate displayLayer:] 被描述 here .

    [NSView updateLayer] here .

    0 回复  |  直到 5 年前
        1
  •  1
  •   Lucas Derraugh    5 年前

    -[NSView updateLayer:]

    此方法的目的是由 NSView 子类,以便您可以自定义支持层。默认情况下, -[NSView drawRect:] UIView 在iOS上)。如果你想自定义备份层,你应该使用 -updateLayer 并在此方法中执行自定义。选择使用 updateLayer drawRect: ,您覆盖 -[NSView wantsUpdateLayer] 然后回来 YES . 现在您可以更改 -更新层 . 若要通知视图需要进行更改,请使用 needsDisplay 属性并将其设置为 ,这将触发 -更新层 layerContentsRedrawPolicy 属性,该属性控制何时触发重绘。

    示例用法:

    @implementation MyView
    
    - (BOOL)wantsUpdateLayer {
        return YES;
    }
    
    - (void)updateLayer {
        // Perform different customizations based on view/control state.
        self.layer.backgroundColor = NSColor.redColor.CGColor;
        self.layer.contents = <some image>;
    }
    
    @end
    
    // Example of notifying MyView instance that it needs to update itself
    myView.needsDisplay = YES;
    

    video 我最近对这个话题做了一些研究。

    -[CALayerDelegate displayLayer:]

    这个电话是专门打给卡莱尔的。如果您没有处理NSView,那么这就是如何通知您CALayer由于调用 -[CALayer setNeedsDisplay]

    简而言之,如果你在处理 要完全控制备份层,必须重写 -wantsUpdateLayer 返回 并实施 -更新层 CALayer s(不 NSView公司 ,则委托在这里可能很有用。

        2
  •  0
  •   aleclarson    5 年前

    这是我自己的发现。

    如果你重写 -[NSView makeBackingLayer] ,你 必须 使用 -[CALayerDelegate displayLayer:] 而不是 -[NSView updateLayer]


    CALayer与NSViewBackingLayer之比较

    如果你不重写 makeBackingLayer 然后你设置 wantsLayer YES ,默认的层类称为 _NSViewBackingLayer

    它的行为不同于 CALayer 在以下方面:

    • 电话 setNeedsDisplay:YES 当它 transform 属性已设置。
    • 也许还有别的办法。。。?