在横向上使用UIImagePickerController

我正在创build一个横向模式的应用程序,我正在使用UIImagePickerController拍摄使用iPhone相机的照片,我也想在横向模式下创build它。

但是,正如苹果的文件显示, UIImagePickerController不支持横向,所以我应该怎么做才能获得所需的function?

如果您想在横向模式下使用UIImagePickerController,请使用user1673099的答案 ,而不是:

 - (BOOL)shouldAutorotate { return NO; } 

使用:

 - (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskLandscape; } 

然后select器将以横向模式打开:

在这里输入图像描述

但请确保您在部署信息中检查肖像:

在这里输入图像描述

尝试这种方式….

根据Apple文档,ImagePicker控制器从不以横向模式旋转。 只能在肖像模式下使用。

禁用仅用于ImagePicker控制器的横向模式请遵循以下代码:

在你的ViewController.m中:

使图像选取器控制器的子类(NonRotatingUIImagePickerController)

 @interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController // Disable Landscape mode. - (BOOL)shouldAutorotate { return NO; } @end 

使用如下

 UIImagePickerController* picker = [[NonRotatingUIImagePickerController alloc] init]; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; picker.delegate = self; etc.... Just as Default ImagePicker Controller 

这是为我工作&让我知道如果你有任何问题。

在横向模式下使用UIImagePickerController的正确方法是将其放入一个UIPopoverController

 - (void)showPicker:(id)sender { UIButton *button = (UIButton *)sender; UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = YES; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; _popover = [[UIPopoverController alloc] initWithContentViewController:picker]; [_popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } 

修改上面的代码方法

 - (NSUInteger)supportedInterfaceOrientations { UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; if(orientation == UIDeviceOrientationLandscapeRight || orientation == UIDeviceOrientationLandscapeLeft) return UIInterfaceOrientationMaskLandscape; else return UIInterfaceOrientationMaskPortrait; } 

…我也想在横向模式下创build它。

一行代码可以使一个很大的区别! 在IBAction登陆的方法或function中:

在Swift中,

 let imagePickerController = UIImagePickerController() imagePickerController.delegate = self // .overCurrentContext allows for landscape and portrait mode imagePickerController.modalPresentationStyle = .overCurrentContext 

Objective-C中,

 UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; [imagePickerController setDelegate:self]; [imagePickerController setModalPresentationStyle: UIModalPresentationOverCurrentContext]; 

注意:这将允许imagePickerController正确地显示它的视图,但是可能无法解决呈现时的旋转问题。

接受的答案不适用于我。 我还需要添加modalPresentationStyle到UIImagePickerController使其工作。

 UIImagePickerController *pickerController = [[UIImagePickerController alloc] init]; pickerController.modalPresentationStyle = UIModalPresentationCurrentContext; pickerController.delegate = self; pickerController.allowsEditing = YES; pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentViewController:pickerController animated:YES completion:nil]; 

当然记得把这个放在你的委托中:

 - (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } 

但根据苹果公司的文件,这是不支持在景观模式下呈现这个select器,所以要小心。

以下是支持所有界面方向旋转的版本:

 /// Not fully supported by Apple, but works as of iOS 11. class RotatableUIImagePickerController: UIImagePickerController { override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .all } } 

这样,如果用户旋转她的设备,它将更新select器控制器以支持当前的方向。 就像通常的UIImagePickerController一样实例化。

如果您只想支持一个方向子集,则可以返回不同的值。

这适用于iOS 10/11中的Swift 4.0

 import UIKit extension UIImagePickerController { override open var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .all } } 

只要将扩展程序放在项目的某个位置,就不需要子类化它的任何工作。

如果你需要指定设备types,你可以添加一个这样的检查:

 import UIKit extension UIImagePickerController { override open var supportedInterfaceOrientations: UIInterfaceOrientationMask { return UIDevice.current.userInterfaceIdiom == .phone ? .portrait : .all } } 

这将允许iPad自由旋转,但在手机上执行肖像模式。 只要确保您的应用程序configuration为在其info.plist中支持这些应用程序,否则在启动选取器时可能会遇到崩溃。