为什么Cocoa查看顺序覆盖与OSX中的AVCaptureVideoPreviewLayer行为奇怪?

时间:2012-11-01 06:30:59

标签: objective-c macos cocoa avfoundation osx-mountain-lion

我有一个视图控制器控制主视图与兄弟子视图。一个是我称为overlayView的视图,它有一些来自IB的按钮,标签和东西。另一个叫做captureLayer,我以编程方式添加来保存来自网络摄像头的AVCaptureVideoPreviewLayer。出于某种原因,我无法让叠加图层显示在预览图层的顶部。

这不起作用:

capturePreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession];
[self setCaptureView:[[NSView alloc] initWithFrame:[[self view] bounds]]];
// I know the order here is important and I think this is right
[[self captureView] setLayer:capturePreviewLayer];
[[self captureView] setWantsLayer:YES];
[[self view] addSubview:[self captureView] positioned:NSWindowBelow relativeTo:[self overlayView]];
[captureSession startRunning];

但是我发现将capturePreviewLayer放在主视图中,所以overlayView是一个孩子,而不是兄弟的视图,确实有效:

capturePreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession];
[[self view] setLayer:capturePreviewLayer];
[[self view] setWantsLayer:YES];
[captureSession startRunning];

知道为什么吗?我甚至在iOS中使用UIViews做了一个非常类似的事情,并没有看到像这样的奇怪东西。

1 个答案:

答案 0 :(得分:0)

这可能是因为您的captureView是图层支持或图层托管,而您的叠加视图则不是。 overlayView直接绘制到窗口层,captureView在其上绘制了一个新层。

解决方案是使overlayView层也得到支持,并在需要时使用它的zPosition。

在iOS上,默认情况下每个视图都是图层支持,因此这个问题不会在那里显现出来。