2012-05-23 5 views
7

लेयर-होस्टिंग एनएसवीव्स (इसलिए NSViews कि आप CALayer इंस्टेंस की आपूर्ति करते हैं और setLayer: के साथ सेट करते हैं) में स्पष्ट रूप से सबव्यूव शामिल हो सकते हैं। जाहिर है क्यों? क्योंकि एप्पल के स्वयं के Cocoa Slides sample code project में, आप एक चेकबॉक्स है कि परत मेजबानी होने के परत समर्थित होने से AssetCollectionView स्विच जांच कर सकते हैं:क्या परत-होस्टिंग NSViews को सबव्यूज़ रखने की अनुमति है?

- (void)setUsesQuartzCompositionBackground:(BOOL)flag { 
    if (usesQuartzCompositionBackground != flag) { 
     usesQuartzCompositionBackground = flag; 

     /* We can display a Quartz Composition in a layer-backed view tree by 
      substituting our own QCCompositionLayer in place of the default automanaged 
      layer that AppKit would otherwise create for the view. Eventually, hosting of 
      QCViews in a layer-backed view subtree may be made more automatic, rendering 
      this unnecessary. To minimize visual glitches during the transition, 
      temporarily suspend window updates during the switch, and toggle layer-backed 
      view rendering temporarily off and back on again while we prepare and set the 
      layer. 
     */ 
     [[self window] disableScreenUpdatesUntilFlush]; 
     [self setWantsLayer:NO]; 
     if (usesQuartzCompositionBackground) { 
      QCCompositionLayer *qcLayer = [QCCompositionLayer compositionLayerWithFile:[[NSBundle mainBundle] pathForResource:@"Cells" ofType:@"qtz"]]; 
      [self setLayer:qcLayer]; 
     } else { 
      [self setLayer:nil]; // Discard the QCCompositionLayer we were using, and let AppKit automatically create self's backing layer instead. 
     } 
     [self setWantsLayer:YES]; 
    } 
} 

ही AssetCollectionView कक्षा में, subviews वह प्रत्येक छवि प्रदर्शित किया जाना चाहिए के लिए जोड़ रहे हैं:

- (AssetCollectionViewNode *)insertNodeForAssetAtIndex:(NSUInteger)index { 
    Asset *asset = [[[self assetCollection] assets] objectAtIndex:index]; 
    AssetCollectionViewNode *node = [[AssetCollectionViewNode alloc] init]; 
    [node setAsset:asset]; 
    [[self animator] addSubview:[node rootView]]; 
    [nodes addObject:node]; 

    return [node autorelease]; 
} 

जब मैं ऐप बना और चलाता हूं और इसके साथ खेलता हूं, तो सब कुछ ठीक लगता है।

हालांकि, Apple's NSView Class Reference for the setWantsLayer: method में इसे पढ़ता है:

जब एक परत-होस्टिंग दृश्य आपको ड्राइंग के लिए दृष्टिकोण पर निर्भर नहीं होना चाहिए का उपयोग कर, और न ही आप परत-होस्टिंग देखने के लिए subviews जोड़ने चाहिए।

सत्य क्या है? क्या नमूना कोड गलत है और यह सिर्फ एक संयोग है कि यह काम करता है? या दस्तावेज झूठा है (जो मुझे शक है)? या यह ठीक है क्योंकि उपन्यास एनिमेटर प्रॉक्सी के माध्यम से जोड़े गए हैं?

उत्तर

19

जब AppKit है "परत की मेजबानी" हम मानते हैं तो आप (या नहीं हो सकता) है परतों कि AppKit के बारे में पता नहीं है की एक पूरी सबट्री।

आप परत की मेजबानी को देखने के लिए एक subview जोड़ने, तो यह नहीं बाहर सही भाई आदेश है कि आप चाहते हैं में आ सकते हैं। इसके अलावा, हम कई बार जोड़ सकते हैं और, उन्हें हटाने तो यह है जब आप setLayer :, setWantsLayer फोन के आधार पर बदल सकता है: या जब दृश्य जोड़ा गया या superview से हटा दिया है। शेर (और पहले) पर हम परतों है कि हम "के मालिक हैं" को दूर (यानी: परत समर्थित) जब दृश्य खिड़की (या superview) से हटा दिया है।

सबव्यूज़ जोड़ने के लिए ठीक है ... sublayers सरणी में उनके बच्चों-भाई-आदेश शायद यह निर्धारित नहीं हो सकता है कि आपके पास भाई-परतें हैं जो NSViews नहीं हैं।

+0

धन्यवाद बहुत बहुत! –

1

मुझे नहीं पता कि इसका "सही" जवाब क्या है। लेकिन मुझे लगता है कि कोकोस्लाइड्स उदाहरण डॉक्स के कहने की सीमाओं के भीतर काम करता है जो आपको "नहीं करना चाहिए"। उदाहरण में, देखें कि insertNodeForAssetAtIndex: विधि कहां से कॉल की जाती है, और आप देखेंगे कि यह तब होता है जब दृश्य पॉप्युलेट किया जाता है, से पहले इसे कभी भी एक परत सौंपी जाती है या सेटवंटलेयर है: इसे कॉल किया जाता है।

दस्तावेज़ यह नहीं कहते हैं कि एक परत-होस्ट किए गए दृश्य में कोई सबव्यूव नहीं हो सकता है, वे बस कहते हैं कि आप और उप-दृश्य जोड़ नहीं सकते हैं। उस बिंदु पर जब उन सबव्यूव्यू जोड़े जाते हैं, मुख्य दृश्य अभी तक एक परत-होस्टिंग दृश्य नहीं बन गया है। इसे मैन्युअल रूप से बनाए गए परत को एक परत-होस्टिंग दृश्य में बदल दिया गया है, इसके बाद कोई और सबव्यू नहीं जोड़ा गया है।

तो दस्तावेज़ों और इस विशेष उदाहरण के बीच वास्तव में कोई विरोधाभास नहीं है। ऐसा कहा जा रहा है, शुरुआत से ही क्यूसी पृष्ठभूमि परत पर स्विच करके, इसे और अधिक खोजना दिलचस्प हो सकता है, उदा। के अंदर [self setUsesQuartzCompositionBackground:YES]; चिपके हुए।

स्पोलियर अलर्ट: ऐसा लगता है कि यह ठीक काम करता है। डिस्प्ले का निर्माण थोड़ा धीमा है (क्यूसी एनीमेशन के साथ आश्चर्यजनक नहीं है), लेकिन इसके अलावा यह चिकनी नौकायन है।

+0

धन्यवाद, जैक! "जोड़ना" बनाम "पहले से ही" सबव्यूज़ के बारे में दिलचस्प अवलोकन। हो सकता है कि दस्तावेज़ पुराने हैं, क्योंकि वे इस प्रश्न के बारे में भी हैं: http://stackoverflow.com/questions/10720062/are-layer-backed-nsview-siblings-allowed-to-overlap/10720422#10720422 –

0

ऐप्पल से इस कोड के बारे में एक टिप्पणी: यह बस्टेड है।

जब आप पहली बार ऐप शुरू करते हैं, तो अच्छी ढाल पृष्ठभूमि को नोट करें। क्यूसी चालू करें, फिर बंद करें।

Poof, कोई और ढाल पृष्ठभूमि नहीं।

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