0

我有一个视图控制器控制一个主视图和同级子视图。一个是我称之为 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 做了一个非常类似的事情,并没有看到任何奇怪的东西。

4

1 回答 1

0

这可能是因为您的 captureView 是图层支持或图层托管,而您的覆盖视图不是。overlayView 直接绘制到窗口层,而 captureView 绘制到其上的新层。

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

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

于 2012-11-01T16:09:48.307 回答