XcodeのOS Xアプリのテンプレートは空のアプリテンプレートに似ているため、以下はビューとボタンを追加するために使用されます(今のところInterface Builderを使用しないようにします)。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 100, 100)];
view.layer.backgroundColor = [[NSColor yellowColor] CGColor];
[self.window.contentView addSubview:view];
NSRect frame = NSMakeRect(10, 40, 90, 40);
NSButton* pushButton = [[NSButton alloc] initWithFrame: frame];
pushButton.bezelStyle = NSRoundedBezelStyle;
[self.window.contentView addSubview:pushButton];
NSLog(@"subviews are %@", [self.window.contentView subviews]);
}
IOSの同様のコードは黄色のボックスとボタンを生成するはずですが、上のコードはボタンのみを生成しますが、ビューは表示されません。上記のコードに何か問題がありますか?それを黄色の背景でビューに表示するにはどうすればよいですか?
使用する setWantsLayer:
NSViewクラスのメソッド。
NSView *view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 100, 100)];
[view setWantsLayer:YES];
view.layer.backgroundColor = [[NSColor yellowColor] CGColor];
[self.window.contentView addSubview:view];
NSRect frame = NSMakeRect(10, 40, 90, 40);
NSButton* pushButton = [[NSButton alloc] initWithFrame: frame];
pushButton.bezelStyle = NSRoundedBezelStyle;
[self.window.contentView addSubview:pushButton];
NSLog(@"subviews are %@", [self.window.contentView subviews]);
Kevin Ballardの提案を拡張するには、これを行う古典的な方法は、NSView
をサブクラス化し、-drawRect:
メソッドをオーバーライドすることです。 NSRectFill
は、ベジェパスを作成せずに四角形を塗りつぶすための非常に便利な関数です。
- (void)drawRect:(NSRect)rect
{
[[NSColor yellowColor] set];
NSRectFill(rect);
}
CocoaのNSView
sは、デフォルトでは、レイヤーバッキングではありません。入力すると
NSLog(@"%@", view.layer);
nil
であることがわかります。
IOSでは、すべてのビューにレイヤーがあります。ただし、OS Xでは、ビューにレイヤーはありません。さらに、OS Xにはレイヤー付きビューの2つの「モード」があります。「レイヤー付きビュー」と「レイヤーホスティングビュー」と呼ばれるものがあります。レイヤー付きビューはCoreAnimationレイヤーを使用して描画データをキャッシュしますが、レイヤーとのやり取りは一切許可されていません。レイヤーをホストするビューは、明示的に提供するCALayer
を使用します。そのレイヤーを好きなように操作できます。ただし、レイヤーホスティングビューでは、サブビューを追加したりできなかったり、組み込みのNSView
描画メカニズムを使用したりできません。レイヤーをホストするビューは、CoreAnimationレイヤー階層のルートとしてのみ使用する必要があります。
これらすべてを考慮して、ビューにCoreAnimationを使用することはおそらく避けてください。
NSBox
が希望どおりの動作をする可能性があります。そこに塗りつぶしの色を設定し、境界線をオフにし、スタイルをカスタムに設定できます。単純に塗りつぶされた色の長方形として描画されるかどうかは、100%確実ではありません。あるいは、-drawRect:
で色を描画する独自のNSView
サブクラスを定義できます。