В чем разница между CALayerDelegate displayLayer и NSView updateLayer - PullRequest
0 голосов
/ 16 января 2020

[CALayerDelegate displayLayer:] описано здесь .

[NSView updateLayer] описано здесь .

Чем они отличаются? Когда бы я использовал один поверх другого?

Ответы [ 2 ]

1 голос
/ 16 января 2020

-[NSView updateLayer:]

Целью этого метода является переопределение подклассом NSView, чтобы можно было настроить вспомогательный слой. По умолчанию будет использоваться -[NSView drawRect:], и вы не должны манипулировать обратным слоем напрямую (как вы могли бы с UIView на iOS). Если вы хотите настроить слой подложки, вы должны использовать -updateLayer и выполнить ваши настройки в этом методе. Чтобы использовать updateLayer вместо drawRect:, вы переопределяете -[NSView wantsUpdateLayer] и возвращаете YES. Теперь вы можете изменить любое свойство на подложке внутри -updateLayer. Чтобы уведомить представление о необходимости изменения, вы должны использовать свойство needsDisplay и установить для него значение YES, которое будет запускать -updateLayer при выполнении прохода рендеринга. Также полезно знать о свойстве 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;

Бесстыдный плагин видео , который я сделал в этом топи c совсем недавно.

-[CALayerDelegate displayLayer:]

Этот вызов задан c для CALayer. Если вы не имеете дело с NSView, то вы можете получить уведомление о том, что CALayer нуждается в изменении в результате вызова -[CALayer setNeedsDisplay].

Короче говоря, если вы имеете дело с NSView и Чтобы иметь полный контроль над слоем поддержки, вы должны переопределить -wantsUpdateLayer, чтобы вернуть YES и реализовать -updateLayer. Если вы непосредственно используете CALayer s (без NSView участия), тогда делегат может быть полезен здесь.

0 голосов
/ 29 января 2020

Вот мои собственные выводы.

Если вы переопределите -[NSView makeBackingLayer], вы должны использовать -[CALayerDelegate displayLayer:] вместо -[NSView updateLayer].


CALayer против NSViewBackingLayer

Если вы не переопределите makeBackingLayer и установите wantsLayer на YES, класс слоя по умолчанию называется _NSViewBackingLayer.

Он ведет себя иначе, чем CALayer следующими способами:

  • занимает заметно меньше памяти.
  • вызывает setNeedsDisplay:YES, когда установлено его свойство transform.
  • возможно, другими способами тоже ...?
...