2012-09-11 22 views
16

Kể từ khi mẫu của một ứng dụng OS X trong Xcode có vẻ là tương tự như một mẫu ứng dụng rỗng, sau đây được sử dụng để thêm một cái nhìn và một nút (cố gắng không sử dụng giao diện người xây dựng cho bây giờ):Làm cách nào để thêm NSView vào NSWindow trong ứng dụng Cocoa?

- (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]); 
} 

Mã tương tự trên iOS nên đã tạo ra một hộp màu vàng và một nút, nhưng mã ở trên chỉ tạo ra một nút, nhưng chế độ xem sẽ không hiển thị. Có điều gì sai với mã ở trên không và cách làm cho nó hiển thị chế độ xem với nền màu vàng?

Trả lời

16

Sử dụng phương thức lớp NSView setWantsLayer:.

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]); 
+0

NSView không có thuộc tính backgroundColor, có vẻ như vậy. Tôi rất nhớ 'UIKit' ...! –

+5

Câu trả lời này là xấu. Bạn được [nói rõ ràng] (http://developer.apple.com/library/mac/documentation/Cocoa/Tham khảo/ApplicationKit/Lớp học/NSView_Class/Tham khảo/NSView.html # // apple_ref/doc/uid/20000014-SW61) không chạm vào lớp sao lưu ở chế độ xem được hỗ trợ lớp (a xem nơi bạn đã sử dụng '-setWantsLayer:' mà không cần gọi '-setLayer:' trước tiên). Từ tài liệu: ** Khi sử dụng chế độ xem lớp được sao lưu, bạn không bao giờ nên tương tác trực tiếp với lớp ** –

+0

ý của bạn, trước tiên sẽ khởi tạo CALayer, đặt chế độ xem thành view.layer và sau đó đặt wantLayer thành YES và đặt màu nền ? –

5

NSView s trong Cocoa, theo mặc định, không được hỗ trợ lớp. Tôi nghi ngờ rằng nếu bạn nhập

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

bạn sẽ thấy rằng đó là nil.

Trong iOS, tất cả các chế độ xem đều có lớp. Nhưng trên OS X, lượt xem không có lớp. Ngoài ra, có 2 "chế độ" của chế độ xem được hỗ trợ lớp trên OS X. Có những gì được gọi là "chế độ xem lớp được hỗ trợ" và "chế độ xem lớp lưu trữ". Chế độ xem lớp được hỗ trợ sử dụng lớp CoreAnimation để lưu vào bộ nhớ cache dữ liệu được vẽ, nhưng bạn không được phép tương tác với lớp theo bất kỳ cách nào. Chế độ xem lớp lưu trữ sử dụng một số CALayer mà bạn cung cấp rõ ràng và bạn có thể gây rối với lớp đó tất cả những gì bạn muốn. Tuy nhiên, với chế độ xem lớp lưu trữ, bạn có thể không thêm bất kỳ bản xem phụ nào hoặc sử dụng cơ chế vẽ NSView được tích hợp sẵn. Chế độ xem lớp lưu trữ chỉ được sử dụng làm gốc của phân cấp lớp CoreAnimation.

Với tất cả điều này, bạn có lẽ nên tránh sử dụng CoreAnimation cho tất cả các chế độ xem của bạn.

Có thể là NSBox sẽ làm những gì bạn muốn. Bạn chắc chắn có thể đặt màu tô ở đó, tắt đường viền và đặt kiểu thành tùy chỉnh. Tôi chỉ không chắc chắn 100% nó sẽ vẽ như một hình chữ nhật đầy màu sắc đơn giản. Ngoài ra, bạn có thể xác định lớp con NSView của riêng bạn vẽ một màu trong -drawRect:.

+0

bạn có biết cách hiển thị chế độ xem với nền màu vàng không? –

+0

@JeremyL: Tôi đang nghiên cứu ngay bây giờ. Tôi chủ yếu làm iOS, vì vậy hãy tiếp tục. –

+0

@ JeremyL, tôi luôn làm như Kevin đã đề cập, sử dụng NSBox thay vì chế độ xem tùy chỉnh. Chỉ cần thiết lập loại của nó để tùy chỉnh, và sau đó bạn có thể (trong IB hoặc mã) thiết lập màu nền của nó, một màu biên giới (hoặc không có biên giới nếu bạn chọn), và góc tròn nếu bạn muốn. – rdelmar

5

Mở rộng trên gợi ý bởi Kevin Ballard, cách cổ điển để làm điều này là để phân lớp NSView và ghi đè lên các phương pháp -drawRect:. NSRectFill là một chức năng rất thuận tiện để điền hình chữ nhật mà không phải tạo đường bezier:

- (void)drawRect:(NSRect)rect 
{ 
    [[NSColor yellowColor] set]; 
    NSRectFill(rect); 
} 
Các vấn đề liên quan