UIImagePickerController以横向方向录制视频

时间:2013-03-13 04:31:03

标签: iphone ios objective-c video uiimagepickercontroller

我们如何强制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)开始。在正确的位置取消和录制按钮,但其他控制错误。视频旋转。 enter image description here

2)录音。定时器和视频都是错误的。 enter image description here

3)录制完成。都好!结果视频是对的。

enter image description here

你有什么想法吗?

更新 我需要在录制过程中以横向方向锁定屏幕。

2 个答案:

答案 0 :(得分: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;
    }
}

此处isOptionScreenActiveflag,它是在录音类的viewWillAppear中设置的。在false中设置viewDidUnload。或者可能是另一个班级的viewWillAppear

3)我以cameraviewcontroller.m为例。它反映了您的录音课程。同样在您的视频录制课程的shouldAutorotate方法中,如果检测到的方向是纵向,则只返回NO。这样UI就不会改变,你只能将UI保持在横向上。

答案 1 :(得分:0)

尝试这个可能它会帮助你

- (BOOL)shouldAutorotate
{
return NO;
}

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeRight;
}

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

它会工作......:)