1

このチュートリアルを見つけて読みました。それは確かに非常に良いです!私はわざと「読む」という言葉を使っています。もし私が理解していれば、今ここで質問することはなかったでしょう。

今:読んだものをアプリケーションにプラグインしようとしました。静止画像とカメラ プレビューのコントロールを備えた別のオーバーレイが必要です。アプリケーションの残りの部分が回転している間、カメラのプレビューを静止させる必要があります。追加の画像とカメラ機能がたくさんあるので、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 ):addChildViewprepareForSegue

- (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];
}

助けてください?:(

4

1 に答える 1

2

大変申し訳ありません!

上記のチュートリアルの作成者に再度感謝します。よくやった!

コードをバラバラにして別のView Controllerに設定するときに、細部を見落としていました。セッションを開始する必要があります。動作するソースは次のとおりです。

- (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]];

    [[captureManager captureSession] startRunning];
}
于 2013-04-09T12:59:27.463 に答える