0

メインビューと兄弟サブビューを制御するビューコントローラーがあります。1つは、私がoverlayViewと呼んでいるビューで、いくつかのボタンとラベル、およびIBからのものがあります。もう1つはcaptureLayerと呼ばれるもので、Webカメラから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 に答える