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;

执行此操作后,您将看不到任何默认控件。您需要为开始/停止录制和翻转相机等设置自定义按钮。

现在,您可以使用 start/stop 方法来录制视频:

当点击开始录制时,

[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 回答