13

UIImagePickerController コントローラーに横向きモードでのみビデオを録画させるにはどうすればよいですか?

このクラスは縦向きの記録に使用する必要があることはわかっていますが、横向きにする必要があります。

同様の質問がいくつか見つかりましたが、私にとって有効な解決策はありません (iOS 6.1)。

たとえば、デバイスの向きの観察はうまくいきません (この回答- https://stackoverflow.com/a/2147584/775779 )

次のような UIImagePickerController カテゴリを実装すると:

#import "UIImagePickerController+NonRotating.h"

@implementation UIImagePickerController (NonRotating)

- (BOOL)shouldAutorotate
{

    return YES;
}

-(NSUInteger)supportedInterfaceOrientations

{
    return UIInterfaceOrientationMaskLandscape;

}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeRight;
}

@end

ほとんど動作しますが、録画中に一部のコントロールの奇妙な動作と間違ったビデオの向きが見られます (結果のビデオは問題ありません)。

1) 開始します。キャンセルと録音ボタンは正しい位置にありますが、他のコントロールは間違っています。そして、ビデオが回転します。 ここに画像の説明を入力

2) 録音。タイマーとビデオが間違っています。 ここに画像の説明を入力

3) 録音が終了しました。すべて良い!結果のビデオは正しいです。

ここに画像の説明を入力

あなたはなにか考えはありますか?

更新 録画中に画面を横向きにロックする必要があります。

4

2 に答える 2

3

カスタムを実装する必要がありますUIImagePickerController。そのためには、imagepicker のプロパティshowsCameraControlsを FALSE に設定する必要があります。

self.mImagePickerController.showsCameraControls = NO;
self.mImagePickerController.wantsFullScreenLayout = YES;

これを行うと、デフォルトのコントロールは表示されなくなります。録画の開始/停止やカメラの反転などのカスタム ボタンを設定する必要があります。

これで、開始/停止メソッドを使用してビデオを録画できます。

録音開始をクリックすると、

[self.mImagePickerController startVideoCapture];

止まる、

[self.mImagePickerController stopVideoCapture];

カメラ間の切り替えを追跡するには、フラグを使用できます

if (self.mImagePickerController.cameraDevice == UIImagePickerControllerCameraDeviceRear)
    {
        self.mImagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront;
        isFrontCamera = YES;
    }
    else
    {
        self.mImagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear;
        isFrontCamera = NO;
    }

向きの変更時に必要に応じてコントロールを設定できます。AppDelegate.m

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window

これは、向きの変更時に呼び出されるデリゲートです。特定のクラスのオブジェクトを使用して、その shouldAutorotate メソッドを呼び出し、方向に従ってカメラ コントロールの位置を設定できます。

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    [self.objController shouldAutorotate];
    return UIInterfaceOrientationMaskAll;
}

今cameraviewcontroller.mの中に

-(BOOL)shouldAutorotate
{
    UIInterfaceOrientation interfaceOrientation = [[UIDevice currentDevice]orientation];

    if(interfaceOrientation == UIInterfaceOrientationPortrait)
    {
        // your controls setup
    }
    else
    {
        // view accordingly for landscape 
    }
}

私はすべてのポイントをカバーしようとしました。ご不明な点がございましたらお知らせください。それが役に立てば幸い :)

1) フリップ カメラ ボタンのクリック イベントの条件を確認する必要があります。

2) AppDelegate.h: ビデオを記録してプロパティを作成するクラスのオブジェクトを宣言します。ここではCameraViewController、例として使用しています。

CameraViewController *objController;

今 AppDelegate.m で:

self.objController = [[CameraViewController alloc]initWithNibName:@"CameraViewController" bundle:nil];

上記のように、このインスタンスを使用してshouldAutorotateメソッドを呼び出します。そして横向きを返します:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if(isOptionScreenActive == YES)
    {
        [self.shareController shouldAutorotate];
        return UIInterfaceOrientationMaskLandscape;
    }
    else
    {
        [self.anotherController shouldAutorotate];
        return UIInterfaceOrientationMaskPortrait;
    }
}

これisOptionScreenActiveは、レコーディング クラスの にflag設定されているです。viewWillAppearで設定しfalseviewDidUnloadください。viewWillAppearまたは、別のクラスの可能性があります。

3) 例として cameraviewcontroller.m を使用しました。それはあなたの録音クラスを反映しています。また、ビデオ録画クラスのshouldAutorotateメソッドで、検出された向きが縦向きの場合は、NO を返します。この方法では、UI は変更されず、UI を横向きにのみ維持できます。

于 2013-03-23T07:57:54.000 に答える
0

これを試してみてください

- (BOOL)shouldAutorotate
{
return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
 return UIInterfaceOrientationLandscapeRight | UIInterfaceOrientationLandscapeLeft;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeRight;
}

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

それはうまくいくでしょう... :)

于 2013-03-21T04:52:38.443 に答える