このチュートリアルを見つけて読みました。それは確かに非常に良いです!私はわざと「読む」という言葉を使っています。もし私が理解していれば、今ここで質問することはなかったでしょう。
今:読んだものをアプリケーションにプラグインしようとしました。静止画像とカメラ プレビューのコントロールを備えた別のオーバーレイが必要です。アプリケーションの残りの部分が回転している間、カメラのプレビューを静止させる必要があります。追加の画像とカメラ機能がたくさんあるので、AVFoundation にする必要があります。すべてのアプリケーションを回転させたいが、カメラのプレビューは回転させたい。自作のコンテナView Controllerがヒンジポイントになります。その外側では、アプリケーションが回転します。子の回転を制御します。手動の回転を、コンテナ ビュー コントローラーのカメラ プレビューの子ビュー コントローラーのオーバーレイに減らしたいと考えています。
(余談ですが、リンクされたストーリーボード、ARC、およびCoreDataを使用しています(写真については後述))
ポイントは:私はこのビューコントローラをコンテナビューコントローラコンテナビューに持っています。それは私がプレビューを入れたいものです。別のコンテナービューコントローラーの子ビューコントローラーに静止画像が必要で、3番目の子は写真のブラウザーになります。後で、ある子から別の子に移動するためのボタンとジェスチャーがあります。キャプチャ セッション マネージャは、コンテナ ビュー コントローラ、つまり親のプロパティです。
すべての @properties (キャプチャ セッション マネージャー、コンテナー ビュー コントローラー、カメラ プレビュー ビュー コントローラー) を、まだ存在しないときに作成されるように設定しました。カメラ プレビュー ビュー コントローラーに、キャプチャ セッション マネージャーであるプロパティを指定しましたが、これは親セッション マネージャーへのポインターに過ぎないはずです (怠惰または致命的なエラーですか?)。
私が知る限り、デバッガーでステップスルーすると、接続が確立されました。ここで、カメラ プレビュー ビュー コントローラーの viewDidLoad メソッドで、プレビュー レイヤーを表示してみます。
そして、私は... ...空白の白いビューしかありません:(
私は何を忘れたでしょうか?
この時点で、親子接続が確立されているはずです。埋め込みセグエは、子のキャプチャ マネージャーを設定します。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"EmbedCameraPreview"])
{ // present destination view
if ([[segue destinationViewController] isKindOfClass:[CameraPreviewViewController class]]) {
CameraPreviewViewController * destinationVC = (CameraPreviewViewController *)[segue destinationViewController];
[destinationVC setCaptureManager:[self captureManager]];
}
[self addChildView:[segue destinationViewController]];
}
}
- (void) addChildView: (UIViewController*) content {
[self addChildViewController:content];
content.view.frame = [self maxFrame];
[content didMoveToParentViewController:self];
}
- (CGRect) maxFrame {
return [[[self view] layer] bounds];
}
子のキャプチャ マネージャーはプライベート (.m ファイル内) で、パブリック セッターがあります。
インターフェース:
@property (retain, nonatomic) CaptureSessionManager *captureManager;
実装:
@synthesize captureManager;
- (void)setCaptureManager:(CaptureSessionManager *) newCaptureManager {
if (captureManager != newCaptureManager) {
captureManager = newCaptureManager;
}
}
- (CaptureSessionManager *) captureManager {
if (captureManager != nil) {
return captureManager;
}
if ([[self parentViewController] isKindOfClass:[CameraContainerViewController class]]) {
CameraContainerViewController* parentView = (CameraContainerViewController*)[self parentViewController];
[self setCaptureManager:[parentView captureManager]];
}
return captureManager;
}
viewDidLoad
の子は、親のcontent.view.frame = [self maxFrame]
内部から呼び出されます (上記を参照してください: the ):addChildView
prepareForSegue
- (void) displayCameraPreview
{
CGRect layerRect = [[[self view] layer] bounds];
[[[self captureManager] previewLayer] setBounds:layerRect];
[[[self captureManager] previewLayer] setPosition:CGPointMake(CGRectGetMidX(layerRect),
CGRectGetMidY(layerRect))];
[[[self view] layer] addSublayer:[[self captureManager] previewLayer]];
}
- (void) initDisplay {
[self displayCameraPreview];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self initDisplay];
}
助けてください?:(