レイヤーをホストする NSView (つまり、CALayer インスタンスを提供して で設定するsetLayer:
NSView) には、明らかにサブビューを含めることができます。なぜ明らかに?Apple 独自のCocoa Slides サンプル コード プロジェクト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 の NSView クラス リファレンスでは、setWantsLayer:
次のように記述されています。
レイヤーをホストするビューを使用する場合、描画のためにビューに依存したり、レイヤーをホストするビューにサブビューを追加したりしないでください。
何が本当?サンプル コードは正しくなく、動作するのは単なる偶然ですか? それとも、ドキュメントは間違っていますか (私は疑っています)? それともアニメータープロキシ経由でサブビューが追加されているので大丈夫ですか?