21

私のアプリケーションは、ツールバーと背景 UIView の AVCaptureVideoPreviewLayer で構成されています。デバイスの向きに応じてツールバーが回転することを確認したいので、メインの ViewController に次の関数を実装しました。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait
            || interfaceOrientation == UIInterfaceOrientationLandscapeLeft
            || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

これは正常に動作しますが、インターフェイスの向きが変更されると、背景の UIView (ビデオ レイヤーを含む) も回転しているため、ビデオ ビューが左または右に 90 度再生されていることがわかります...これは本当にクールではありません!
だから私の質問は: 特定の UIView で自動回転アニメーションを無効にする方法はありますか?

私はこれに似た質問を1つ見ました: Disabling autorotate for a single UIView、しかし答えは私の問題に適合しません.背景ビューが動かないようにする必要があり、一種の「カウンターアニメーション"。そこで、この話題を取り上げることにしました。

何か案は ?

ありがとう !

4

5 に答える 5

11

この投稿は正しい方向を指していました。AVCaptureVideoPreviewLayerデバイスで を回転させないようにするために、 でラップし、そのUIViewビューを反対方向にアニメーション化しました。

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

    float rotation;

    if (toInterfaceOrientation==UIInterfaceOrientationPortrait) {
        rotation = 0;
    } else
    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) {
        rotation = M_PI/2;
    } else
    if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) {
        rotation = -M_PI/2;
    }

    [UIView animateWithDuration:duration animations:^{
        cameraPreview.transform = CGAffineTransformMakeRotation(rotation);
        cameraPreview.frame = self.view.frame;
    }];
}

少し遠回しに見えますが、スムーズに動きます。プレビュー レイヤーの上にある他のビューは、必要に応じて自動的に回転します。

于 2011-09-02T13:24:22.660 に答える
2
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  return NO;
}

それとも、特定のビューが表示されているときだけ無効にすると言っていましたか? その場合は、UIView の isDescendantOfView メソッドを使用してこれを確認できます。

于 2010-07-21T16:06:57.033 に答える
2

私はついにこれに対する正気の答えを見つけました。「回転防止アニメーション」などをいじる必要はもうありません。

重要なのは、プレビュー レイヤー (非回転ビュー) に UIViewController を使用し、実際のインターフェイスに別の UIViewController を使用することです。shouldAutorotateToInterfaceOrientation: (コードは上記の回答にあります) を使用して、両方の回転オプションを構成します。

  • プレビュー ビュー コントローラは回転しないように設定する必要があります
  • インターフェイス ビュー コントローラーは、必要な向きに回転するように設定する必要があります。

重要なのは、ビューをウィンドウに直接追加して、ビューを分離しておくことです。AppDelegate でこれを行います。

[self.window addSubview:previewViewController.view];
[self.window addSubview:interfaceViewController.view];
self.window.rootViewController = interfaceViewController;
[self.window makeKeyAndVisible];

これにより、ビデオ プレビューがバックグラウンドに配置され、その上にインターフェイス ビューが追加されます。インターフェイスは、プレビューにまったく影響を与えずに自由に自動回転できます。

注意すべき重要な点の 1 つは、インターフェイス ビューの背景を透明にする必要があることです。そうしないと、プレビューがブロックされます。

于 2013-02-26T16:28:09.303 に答える
1

同じ問題が発生しましたが、AVCaptureVideoPreviewLayerでorientationプロパティを設定するだけでは不十分でした。追加の問題は、CALayerがiPhoneのレイアウトマネージャーをサポートしていないため、デバイスを回転させたときにビデオレイヤーのフレームが正しくない可能性があることです。

カスタムUIViewを使用してAVCaptureVideoPreviewLayerを含めることでこれを修正し、次にこのビューのlayoutSubviewsメソッドをオーバーライドして、ビデオレイヤーのフレームが常に正しく設定されるようにしました。これは、orientationプロパティを設定するのにも適した場所です。つまり、私のUIViewは次のようになります。

@implementation VideoPreview

@synthesize previewLayer;

- (void) layoutSubviews {
    if (previewLayer) {
        // set the correct orientation for the video layer
        previewLayer.orientation = [[UIDevice currentDevice] orientation];

        // and set its frame to that of its parent UIView
        previewLayer.frame = self.bounds;
    }
}

- (void) addPreviewLayer: (AVCaptureVideoPreviewLayer *) videoLayer {
    previewLayer = videoLayer;
    [self.layer addSublayer:videoLayer];
}

@end
于 2011-04-22T11:19:06.657 に答える
-2

これを試して:

myVideoCaptureLayer.orientationSupported = NO;
于 2010-07-21T17:27:10.787 に答える