在横向上使用UIImagePickerController

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

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

  • 调整从相机拉取的UIimages的大小也旋转的UIimage?
  • UIImagePickerController摄像头视图在iOS 8上奇怪的旋转(图片)
  • 使用UIImagePickerController时,iOS 10错误 <私人>
  • 将选取的图像保存到CoreData
  • didFinishPickingMediaWithInfo返回零照片
  • 自定义视图的相机
  • UIImagePicker允许Editing卡在中心
  • UIImagePickerController不填充屏幕
  • 8 Solutions collect form web for “在横向上使用UIImagePickerController”

    如果您想在横向模式下使用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中支持这些应用程序,否则在启动选取器时可能会遇到崩溃。