How to add a CALayer to an NSView on Mac OS X

前端 未结 4 361
灰色年华
灰色年华 2021-02-02 12:37

I\'m trying to learn how to use and implement CALayer in a Mac Objective-C application, but I can\'t seem to probably do the most basic thing - add a new layer and

相关标签:
4条回答
  • 2021-02-02 12:52

    You need to make a call to the "setWantsLayer" method.

    Check out the following documentation for the description for setWantsLayer: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html

    In a nutshell, your view needs to be layer-hosting view. Because it is a layer-hosting view, you should interact with the layer, and NOT interact with the view itself and don't add subviews to it.

    [self setLayer:[CALayer new]];
    [self setWantsLayer:YES];     // the order of setLayer and setWantsLayer is crucial!
    [self.layer setBackgroundColor:[backgroundColor CGColor]];
    
    0 讨论(0)
  • 2021-02-02 12:53

    Updated info (Swift): first call view.makeBackingLayer() then set wantsLayer to true.

    https://developer.apple.com/documentation/appkit/nsview/1483695-wantslayer

    0 讨论(0)
  • 2021-02-02 13:01

    First of all, you don't want to add a layer in the drawRect: method of a view, this gets called automatically by the system and you'd probably end up with a lot more layers than you actually want. initWithFrame: or initWithCoder: (for views that are in a nib file) are better places to initialize your layer hierarchy.

    Furthermore, NSViews don't have a root layer by default (this is quite different from UIView on iOS). There are basically two kinds of NSViews that use a layer: layer-backed views and layer-hosting views. If you want to interact with the layer directly (add sublayers etc.), you need to create a layer-hosting view.

    To do that, create a CALayer and call the view's setLayer: method. Afterwards, call setWantsLayer:. The order is important, if you'd call setWantsLayer: first, you'd actually create a layer-backed view.

    0 讨论(0)
  • 2021-02-02 13:10

    Put this out of the drawRect. I normally put my layer setup in either the init method or the viewDidLoad.

    Otherwise anytime the view is drawn a new layer is added and allocated. Also I've never used the [layer display] line before. The docs actually tell you not to call this method directly.

    0 讨论(0)
提交回复
热议问题