2013-03-02 19 views
7

Tôi đang cố gắng tạo một NSWindow tùy chỉnh, vì vậy tôi đã tạo một mặt nạ có mặt nạ cửa sổ không viền thích hợp và hoạt động. Tôi cung cấp chế độ xem nội dung của riêng tôi. Nhưng những gì tôi đang cố gắng làm là vẽ với các góc tròn mà cũng xem clip phụ cho các góc đó. Điều này có thể không?Tùy chỉnh NSWindow với các góc được làm tròn để xem clip phụ

Trong chế độ xem nội dung của mình, tôi có thể ghi đè drawRect: và vẽ đường có các góc tròn, nhưng khi tôi thêm các bản xem trước vào phần này, chúng sẽ không bị cắt bớt.

Thay vào đó, tôi có thể đặt chế độ xem lớp nội dung và đặt bán kính góc (với masksToBounds đặt thành YES) nhưng khi tôi thêm các bản phụ, chúng vẫn không bị cắt bớt bởi các góc tròn của tôi.

Có cách nào để thực hiện việc này không? Hoặc một số cách để vẽ một NSWindow mà không có một thanh tiêu đề và mà tôi muốn có toàn quyền kiểm soát bản vẽ, và vẫn duy trì các góc tròn, cắt?

Trả lời

12

Những gì tôi đã có thể làm là cung cấp một lớp con tùy chỉnh của NSWindow tôi:

@implementation ELGRoundWindow 

- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag 
{ 
    self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:bufferingType defer:flag]; 

    if (self) 
    { 
     [self setStyleMask:NSBorderlessWindowMask]; 
     [self setOpaque:NO]; 
     [self setBackgroundColor:[NSColor clearColor]]; 
    } 

    return self; 
} 


- (void) setContentView:(NSView *)aView 
{ 
    aView.wantsLayer   = YES; 
    aView.layer.frame   = aView.frame; 
    aView.layer.cornerRadius = 20.0; 
    aView.layer.masksToBounds = YES; 


    [super setContentView:aView]; 

} 

@end 

và sau đó trong IB, tôi đã thay đổi các lớp xem nội dung của tôi để ELGRoundView:

@implementation ELGRoundView 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [[NSColor colorWithCalibratedRed:0.0 green:0.5 blue:1 alpha:1] set]; 
    NSRectFill(dirtyRect); 
} 

@end 

tôi đã đặt một chế độ xem phụ vuông khác trong chế độ xem nội dung của tôi với:

@implementation ELGSquareView 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [[NSColor colorWithCalibratedRed:0.0 green:0 blue:1 alpha:1] set]; 
    NSRectFill(dirtyRect); 
} 

@end 

Tôi đã kết thúc bằng:

Rounded window with clipped subview

+0

Người đọc khác cần lưu ý rằng các ứng dụng OpenGL chỉ nên sử dụng lệnh 'glDrawArrays()' cho toàn cảnh, nếu không lớp sẽ gây ra kết quả lạ. Trong phạm vi của câu hỏi này, hãy sử dụng bán kính góc 4,5-5,0 cho các góc kiểu OS X. Bạn cũng có thể giữ thanh tiêu đề bình thường, nếu bạn muốn, không có nó trông quá khác nhau. – Justin

+4

@ericgorr bất kỳ ý tưởng làm thế nào để có được bóng tối về điều này? –

5

@ericgorr được đề xuất là chính xác. Ngoài ra nếu bạn muốn cửa sổ để được thay đổi di chuyển và thay đổi kích thước các init của NSWindow như sau,

- (id)initWithContentRect:(NSRect)contentRect 
       styleMask:(NSUInteger)aStyle 
        backing:(NSBackingStoreType)bufferingType 
        defer:(BOOL)flag 
{ 
    self = [super initWithContentRect:contentRect 
          styleMask:aStyle 
           backing:bufferingType 
           defer:flag]; 
    if (self) {    
     [self setOpaque:NO]; 
     [self setBackgroundColor:[NSColor clearColor]]; 
     [self setMovableByWindowBackground:YES]; 
     [self setStyleMask:NSResizableWindowMask]; 
    } 
    return self; 
} 

Đối với tuỳ biến hơn nữa tham khảo Apple sample codehttp://developer.apple.com/library/mac/#samplecode/RoundTransparentWindow/Introduction/Intro.html

1

subclassing là cách linh hoạt nhất. Nếu bạn không muốn phân lớp sử dụng mã này.

// unfortunately the window can't be moved 
// but this is just an alert type window, so i don't care 
// 
[window setOpaque:NO]; 
[window setBackgroundColor:[NSColor clearColor]]; 

NSView* contentView = window.contentView; 

contentView.wantsLayer = YES; 
contentView.layer.backgroundColor = [NSColor windowBackgroundColor].CGColor; 
contentView.layer.masksToBounds = YES; 
contentView.layer.cornerRadius = 16.0; 

[window makeKeyAndOrderFront:self]; 
[window center]; 
Các vấn đề liên quan