2015-03-19 11 views
8

मेरे पास एक कस्टम परत-समर्थित एनएसवी व्यू है और कस्टम कैलियर सबक्लास को वापस करने के लिए मेकबैकिंगलेयर विधि को ओवरराइड कर दिया है। मैंने ओवरडिन भी चाहता है अपडेट लेयर को वापस लौटने के लिए पूरी तरह से लेयर-जैसे ड्राइंग में ऑप्ट आउट करना। विधि के रूप में करने का विरोध किया updateLayer: विधिलेयर ने कस्टम कैलियर के साथ NSView का बैक अप अपडेटलायर को कॉल नहीं किया?

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 
} 

एक बार मैं ऐसा करते हैं, मुझे लगता है कि जब मैं NSView.needsDisplay = true यह मार्गों सेट कस्टम परत की drawInContext करने के लिए कॉल पाते हैं। ऐसा क्यों करता है? मेरे उदाहरण में, मैंने जांच की है कि अगर मैं makeBackingLayer ओवरराइड हटा देता हूं तो मेरे updateLayer को अपेक्षित तरीके से बुलाया जाता है।

मैं अपनी अंगुली को काफी नहीं डाल सकता, लेकिन अन्य उदाहरण इस धारणा को इंगित करते हैं कि जब आपके मेकबैकिंग लेयर returns a custom कैलियर 'कि वास्तव में आपके पास कस्टम बैकिंग परत के अंदर होस्ट की गई कस्टम परत है। (मेरे हिस्से पर शुद्ध अटकलें)

आगे, क्या दो ड्राइंग मार्गों के बीच अलग-अलग प्रदर्शन विशेषताएं होंगी जो कि कैलियर के ड्रॉइन कॉन्टेक्स्ट: अधिक "निम्न-स्तर" है? उस प्रश्न पर अधिक जानकारी के लिए यह SO प्रश्न देखें: Layer-backed NSView performance with rendering directly in CALayer.drawInContext:

किसी भी अंतर्दृष्टि की सराहना की जाएगी।

उत्तर

0

क्या आप layerContentsRedrawPolicy और wantsLayer गुणों को सेट करना भूल गए हैं?

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

मेरे पास संपत्ति ठीक है जैसा आपने ऊपर किया है। दुर्भाग्य से यह जवाब नहीं है। – Sam

2

निश्चित रूप से आप यह अब तक तय हो गई है, लेकिन भविष्य पाठकों के लिए मैं NSView documentation पढ़ कर एक संभावित व्याख्या मिल गया! canDrawSubviewsIntoLayer संपत्ति हाँ पर सेट है

हैं, तो दृश्य इस विधि द्वारा दिए गए मान पर ध्यान नहीं देता। इसके बजाय, दृश्य हमेशा अपनी सामग्री खींचने के लिए drawRect: विधि का उपयोग करता है।

संबंधित मुद्दे