2015-03-19 20 views
8

Tôi có NSView hỗ trợ lớp tùy chỉnh và đã bỏ qua phương thức makeBackingLayer để trả lại lớp con CALayer tùy chỉnh. Tôi cũng đã overriden wantUpdateLayer để trả về true do đó hoàn toàn chọn vào bản vẽ giống như lớp.Lớp phủ NSView được hỗ trợ với CALayer tùy chỉnh không gọi updateLayer?

override func makeBackingLayer() -> CALayer { 
    return Layer() // my custom class with "drawLayer:" implemented 
} 

override var wantsUpdateLayer:Bool{ 
    return true 
} 

// never called 
override func updateLayer() { 
    super.updateLayer() 
    println("updateLayer after") 
    self.layer?.borderWidth += 1 
} 

Khi tôi làm điều này, tôi thấy rằng khi tôi đặt NSView.needsDisplay = true nó tuyến các cuộc gọi đến drawInContext lớp tùy chỉnh của: Phương pháp như trái ngược với updateLayer: phương pháp. Tại sao lại thực hiện điều này? Trong ví dụ của tôi, tôi đã kiểm tra rằng nếu tôi xóa ghi đè makeBackingLayer thì số updateLayer của tôi được gọi theo cách mong đợi.

Tôi không thể đặt ngón tay lên đó, nhưng các trường hợp khác trỏ đến quan niệm rằng khi makeBackingLayer returns a custom CALayer` của bạn thực sự có lớp tùy chỉnh được lưu trữ bên trong lớp sao lưu chính. (Tinh khiết đầu cơ trên một phần của tôi)

Hơn nữa, sẽ có đặc điểm hiệu suất khác nhau giữa hai tuyến đường vẽ cho drawInContext của CALayer: là "thấp cấp"? Xem câu hỏi SO này để biết thêm chi tiết về câu hỏi đó: Layer-backed NSView performance with rendering directly in CALayer.drawInContext:

Mọi thông tin chi tiết sẽ được đánh giá cao.

Trả lời

0

Bạn quên đặt thuộc tính layerContentsRedrawPolicywantsLayer?

self.wantsLayer = YES; 
self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay; 
+0

Tôi có thuộc tính chính xác như bạn có ở trên. Thật không may đó không phải là câu trả lời. – Sam

2

Chắc chắn bạn đã khắc phục nó ngay bây giờ, nhưng đối với người đọc trong tương lai, tôi đã tìm thấy giải thích có thể bằng cách đọc NSView documentation!

Nếu thuộc tính canDrawSubviewsIntoLayer được đặt thành CÓ, chế độ xem bỏ qua giá trị được trả về bằng phương pháp này. Thay vào đó, chế độ xem luôn là sử dụng phương thức drawRect: để vẽ nội dung của nó.

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