2012-09-13 24 views
9

Tôi tạo ra một ứng dụng Cocoa trống trên Xcode cho OS X, và nói thêm:Làm thế nào để NSView không cắt khu vực giới hạn của nó?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    self.view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 200, 200)]; 
    self.view.wantsLayer = YES; 
    self.view.layer = [CALayer layer]; 
    self.view.layer.backgroundColor = [[NSColor yellowColor] CGColor]; 
    self.view.layer.anchorPoint = CGPointMake(0.5, 0.5); 
    self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI/180, 1, 1, 1); 

    [self.window.contentView addSubview:self.view]; 
} 

Nhưng nền lớp xoay được cắt bớt theo khu vực ranh giới của quan điểm:

enter image description here

Tôi nghĩ vì một số phiên bản OS X và iOS, chế độ xem sẽ không cắt nội dung của các phần phụ của nó và sẽ hiển thị mọi thứ bên trong và bên ngoài? Trên iOS, tôi thấy hành vi đó, nhưng tôi tự hỏi tại sao nó lại xuất hiện như thế và cách làm mọi thứ hiển thị? (Tôi đã sử dụng Xcode 4.4.1 mới nhất trên Mountain Lion).

(lưu ý: nếu bạn thử mã ở trên, bạn sẽ cần phải liên kết với Quartz Core và có thể nhập tiêu đề lõi thạch anh, mặc dù tôi tự hỏi tại sao tôi không nhập tiêu đề và vẫn biên dịch hoàn hảo)

Trả lời

10

nó chỉ ra rằng nếu dòng:

((NSView *)self.window.contentView).wantsLayer = YES; 

được thêm vào đầu, sau đó nó hoạt động như mong đợi:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    ((NSView *)self.window.contentView).wantsLayer = YES; 

    self.view = [[NSView alloc] initWithFrame:NSMakeRect(200, 200, 200, 200)]; 

    self.view.wantsLayer = YES; 

    self.view.layer.backgroundColor = [[NSColor yellowColor] CGColor]; 

    [self.window.contentView addSubview:self.view]; 
    self.view.layer.anchorPoint = CGPointMake(0.5, 0.5); 

    self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI/180, 0, 0, 1); 

} 

vì vậy, nó trông như thế nào nếu tất cả các quan điểm được thực hiện để được lớp sao lưu, sau đó nó hoạt động giống như trên iOS. (Nếu có một cách nhanh chóng để làm cho tất cả các lớp xem được sao lưu tự động, đó sẽ là tốt).

dòng anchorPoint không thể được di chuyển trước đường addSubview, nếu không nó không chính xác, mặc dù tôi tự hỏi tại sao điều đó lại tạo nên sự khác biệt.

Dòng self.view.layer = [CALayer layer]; có thể bị xóa nếu window.contentView là lớp được sao lưu. Cả contentView và self.view không cần phải đặt lớp và tôi cũng tự hỏi tại sao.

Dòng transform không được trước đường addSubview, nếu không nó sẽ không quay và tôi cũng tự hỏi tại sao.

Điều thứ ba là, tôi nghĩ rằng nếu tôi đi đến giao diện Builder và làm cho contentView một lớp học của ContentView (subclassing NSView), và trong phương pháp init của nó, làm một self.wantsLayer = YES;, sau đó nó sẽ làm việc quá, nhưng nó không phải.

Nhưng dù sao, mã ở trên hoạt động và tôi sẽ cập nhật các lý do nêu trên tại sao khi tôi tìm hiểu thêm.

enter image description here

+0

Tôi là nhà phát triển iOS và gần đây tôi đã bắt đầu làm việc trong Cocoa. Điều này đã khiến tôi phát điên trong ba ngày qua. Tôi ngạc nhiên vì tôi không thể tìm thêm thông tin về nó. Cảm ơn bạn đã đăng giải pháp của bạn !! – KevinM

+0

Có thể có vấn đề khi bạn kết hợp NSView với các lớp và những lớp không có lớp. Nó không phải là ổn định mà nội dung sẽ che phủ trên những người khác. – Slavik

+1

Đặt 'self.wantsLayer = YES' không hoạt động trong' init' vì 1. initializer chính xác là 'initWithFrame:' ​​và 2. thậm chí điều này không được gọi cho các khung nhìn được nạp từ các ngòi ngách. Bạn nên ghi đè '-awakeFromNib' và thực hiện thiết lập của bạn ở đó. Ngoài ra, bạn có thể đặt thuộc tính Lớp hoạt ảnh lõi trong thanh tra Chế độ xem hiệu ứng của IB. –

Các vấn đề liên quan