Разрешается ли слой -, на котором размещаются NSView, иметь подпредставления?

Слой -, на котором размещаются NSViews (, поэтому NSViews, для которых вы предоставляете экземпляр CALayer и устанавливаете его с помощьюsetLayer:)очевидно, может содержать подпредставления. Почему очевидно? Поскольку в собственном проекте примера кода Cocoa Slides от Apple вы можете установить флажок, который переключает AssetCollectionViewс резервного слоя -на размещение слоя -:

- (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добавляются подпредставления для каждого изображения, которое должно отображаться:

- (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 для метода setWantsLayer:он читается как:

When using a layer-hosting view you should not rely on the view for drawing, nor should you add subviews to the layer-hosting view.

Что правда? Является ли пример кода неверным, и это просто совпадение, что он работает? Или документация ложна (, в чем я сомневаюсь )? Или это нормально, потому что подвиды добавляются через прокси аниматора?

7
задан Johannes Fahrenkrug 23 May 2012 в 11:54
поделиться