🐰

NSViewでmakeBackingLayerを使うとupdateLayerは呼ばれません

に公開

NSViewのバッキングレイヤーに独自のレイヤーを設定すると、どうもupdateLayer()が呼ばれない仕組みのようです。updateLayer()を使いたければmakeBackingLayer()を諦めるのが現状とれる方針です。

例えば以下のような実装で、CustomViewに対してredraw()を実行してもupdateLayer()は実行されません。

class CustomView: NSView {
	
	override func makeBackingLayer() -> CALayer {
		// バッキングレイヤーに独自のレイヤー(CALayer)を設定
		CustomLayer()
	}
	
	override var wantsUpdateLayer: Bool {
		// ビューの描画でdrawRect()ではなくupdateLayer()を使う設定にする
		true
	}

	private func setup() {
		wantsLayer = true
		layerContentsRedrawPolicy = .onSetNeedsDisplay
	}

	func redraw() {
		// updateLayer() が呼ばれることを期待して、再描画を予約
		needsDisplay = true
	}
    
	override func updateLayer() {
		// 任意の描画処理
	}

}

canDrawSubviewsIntoLayerにtrueを設定すると、サブビューの描画処理はdrawRect()で実行されるようです。

https://developer.apple.com/documentation/appkit/nsview/candrawsubviewsintolayer

関連

https://developer.apple.com/forums/thread/4853
https://stackoverflow.com/questions/29140865/layer-backed-nsview-with-custom-calayer-not-calling-updatelayer
https://x.com/micmarkow/status/704685308810563584

Discussion