我们如何强制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)录制完成。都好!结果视频是对的。
你有什么想法吗?
更新 我需要在录制过程中以横向方向锁定屏幕。
答案 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;
}
}
此处isOptionScreenActive
是flag
,它是在录音类的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);
}
它会工作......:)