2012-03-04 13 views
17

CALayerをMac Objective-Cアプリケーションで使用して実装する方法を学習しようとしていますが、おそらく最も基本的なことはできません新しいレイヤーを作成し、背景色/フレームサイズを設定します。誰が私のコードで何が間違っているのを見ることができますか?Mac OS XのNSViewに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方法でこれを置くが、私はアプリケーションを実行すると、それはちょうど私が作成した層の無い背景色や証拠で、空白の図を示しています。

答えて

48

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

さらに、NSViewにはデフォルトでルートレイヤーがありません(これはiOSのUIViewとはまったく異なります)。基本的にレイヤーを使用するNSViewの2種類があります。レイヤービューをバックアップし、レイヤーホスティングを表示します。レイヤーと直接やりとりしたい場合(サブレイヤーを追加するなど)、レイヤーを作成する必要があります。が表示されます。

これを行うには、CALayerを作成し、ビューのsetLayer:メソッドを呼び出します。その後、setWantsLayer:に電話してください。順序が重要です。setWantsLayer:を最初に呼び出す場合は、実際にレイヤーバックビューを作成します。

+0

この有益な答えをありがとう、私はおそらく、nsviewに接続された基本レイヤーがないと思っていた –

1

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

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

+0

返信ありがとうございますが、これは何も変わりません。ビューはまだ空白です。私は、Mac OS Xアプリケーションを作成しようとしているので、私はviewDidLoadを呼び出すことはできません。 – GravityScore

+0

申し訳ありませんが、私はそれを逃しました。ウィンドウのロード時に発生する初期化メソッドがいくつか存在する必要があります。私はMacプログラミングに精通していませんが、QuartzCoreをCALayerに適用するためにインポートする必要があることを私は知っています(私はあなたがこれを知っていると仮定したくありません)。また、ルートレイヤーを直接操作して、それが動作しているかどうかを調べることもできます([self.layer setBackgroundColor:...])。 – atreat

4

"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]]; 
関連する問題