web-dev-qa-db-ja.com

Mac OSXのNSViewにCALayerを追加する方法

MacObjective-CアプリケーションでCALayerを使用して実装する方法を学ぼうとしていますが、おそらく最も基本的なことはできないようです。新しいレイヤーを追加し、その背景色/フレームを設定します。サイズ。誰かが私のコードの何が問題になっているのかわかりますか?

_CALayer *layer = [CALayer layer];
[layer setFrame:CGRectMake(0, 0, 100, 100)];
[layer setBackgroundColor:CGColorCreateGenericRGB(1.0, 0.0, 0.0, 1.0)];
[self.layer addSublayer:layer];
[layer display];
_

これをカスタムNSViewサブクラスの- (void)drawRect:(NSRect)rectメソッドに入れましたが、アプリケーションを実行すると、背景色や作成したレイヤーの証拠がなく、空白のビューが表示されます。

20
GravityScore

まず、ビューのdrawRect:メソッドにレイヤーを追加する必要はありません。これはシステムによって自動的に呼び出され、実際に必要な数よりもはるかに多くのレイヤーが作成される可能性があります。 initWithFrame:またはinitWithCoder:(nibファイルにあるビューの場合)は、レイヤー階層を初期化するのに適した場所です。

さらに、NSViewsにはデフォルトでルートレイヤーがありません(これはiOSのUIViewとはかなり異なります)。レイヤーを使用するNSViewsには、基本的に2種類あります。layer-backedビューとlayer -hostingビューです。レイヤーを直接操作する(サブレイヤーを追加するなど)場合は、レイヤー-hostingビューを作成する必要があります。

これを行うには、CALayerを作成し、ビューのsetLayer:メソッドを呼び出します。その後、setWantsLayer:に電話します。順序は重要です。最初にsetWantsLayer:を呼び出すと、実際にはレイヤーに裏打ちされたビューが作成されます。

55
omz

「setWantsLayer」メソッドを呼び出す必要があります。

SetWantsLayerの説明については、次のドキュメントを確認してください。 https://developer.Apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html

一言で言えば、ビューはレイヤーホスティングビューである必要があります。これはレイヤーホスティングビューであるため、レイヤーを操作する必要があります。ビュー自体を操作したり、サブビューを追加したりしないでください。

[self setLayer:[CALayer new]];
[self setWantsLayer:YES];     // the order of setLayer and setWantsLayer is crucial!
[self.layer setBackgroundColor:[backgroundColor CGColor]];
5
Amber Haq Dixon

これをdrawRectから外します。私は通常、レイヤー設定をinitメソッドまたはviewDidLoadのいずれかに配置します。

それ以外の場合、ビューが描画されるたびに、新しいレイヤーが追加され、割り当てられます。また、これまで[レイヤー表示]行を使用したことはありません。ドキュメントには、実際にはこのメソッドを直接呼び出さないように指示されています。

1
atreat