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