19

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 の同様のコードは黄色のボックスとボタンを生成するはずでしたが、上記のコードはボタンのみを生成し、ビューは表示されません。上記のコードに何か問題がありますか? また、ビューを黄色の背景で表示するにはどうすればよいですか?

4

3 に答える 3

21

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]);  
于 2012-09-11T06:39:13.323 に答える
6

Kevin Ballard による提案を拡張すると、これを行う古典的な方法は、メソッドをサブクラス化NSViewしてオーバーライドする-drawRect:ことです。NSRectFillベジェ パスを作成せずに四角形を塗りつぶすための非常に便利な関数です。

- (void)drawRect:(NSRect)rect
{
    [[NSColor yellowColor] set];
    NSRectFill(rect);
}
于 2013-03-21T11:59:35.157 に答える
5

NSViewCocoa の s は、デフォルトではレイヤーベースではありません。あなたが入力した場合、私はそれを疑う

NSLog(@"%@", view.layer);

であることがわかりますnil

iOS では、すべてのビューにレイヤーがあります。しかし、OS X では、ビューにレイヤーがありません。さらに、OS X にはレイヤーに基づくビューの 2 つの「モード」があります。「レイヤーに基づくビュー」と「レイヤー ホスティング ビュー」と呼ばれるものがあります。レイヤーに基づくビューは、CoreAnimation レイヤーを使用して描画データをキャッシュしますが、レイヤーを操作することは一切許可されていません。レイヤーをホストするビューは、CALayer明示的に提供する を使用し、そのレイヤーを好きなようにいじることができます。ただし、レイヤーをホストするビューでは、サブビューを追加したり、組み込みの描画メカニズムを使用したりすることはできません。NSViewレイヤー ホスティング ビューは、CoreAnimation レイヤー階層のルートとしてのみ使用する必要があります。

これらすべてを考えると、おそらく、ビューに CoreAnimation をまったく使用しないようにする必要があります。

NSBox意志があなたが望むことをする可能性があります。そこに塗りつぶしの色を設定し、境界線をオフにして、スタイルをカスタムに設定できます。単純な塗りつぶされた色の長方形として描画されるとは100%確信が持てません。NSViewまたは、 で色を描画する独自のサブクラスを定義することもできます-drawRect:

于 2012-09-11T06:01:06.303 に答える