在 ios 应用程序中将 UIImagePickerController 锁定为纵向模式
Posted
技术标签:
【中文标题】在 ios 应用程序中将 UIImagePickerController 锁定为纵向模式【英文标题】:lock UIImagePickerController in Portrait mode in ios app 【发布时间】:2012-01-20 11:05:37 【问题描述】:在我的 ios 应用程序中,当我打开相机时,我在相机视图上放置了一张图像。在纵向模式下看起来不错。但是当它更改为横向模式时,它看起来有些奇怪。所以我想将UIImagePickerController
锁定为纵向模式。
以下是我的 ui 图像选择器控制器代码
UIImagePickerController *imgPkr = [[UIImagePickerController alloc] init];
imgPkr.delegate = self;
imgPkr.sourceType = UIImagePickerControllerSourceTypeCamera;
如何将其锁定为纵向模式......
【问题讨论】:
【参考方案1】:或者,您可以继承 UIImagePickerController:
创建一个新的 UIImagePickerController 类并将这些行添加到它。
- (BOOL)shouldAutorotate
return NO;
将其导入到使用相机的类中,而不是使用默认的 UIImagePickerController,而是使用您创建的类。
您的相机本身应该停止自动旋转。
【讨论】:
【参考方案2】:这不是最好的解决方案,但它确实有效:
AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
[appDelegate.window addSubview:cameraOverlay];
imgPicker.cameraOverlayView = appDelegate.window.superview;
背景上的相机仍在旋转,但您的叠加视图不会。 希望对你有用
【讨论】:
【参考方案3】:唯一对我有用的解决方案是类别,但我也必须添加另一种方法:
#import "UIImagePickerController+NoRotate.h"
@implementation UIImagePickerController (NoRotate)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
return (interfaceOrientation == UIInterfaceOrientationPortrait);
- (NSUInteger)supportedInterfaceOrientations
return UIInterfaceOrientationMaskPortrait;
@end
干杯!
【讨论】:
【参考方案4】:您不必“将 UIImagePicker 控制器锁定为纵向模式”。
正如您所说“当它更改为横向模式时,它看起来有些奇怪”
其实我不知道你为什么说它看起来很奇怪。
但是,这是我的 UIImagePicker 视图在横向模式下看起来很奇怪的体验。
那是:
当 AViewController 作为根视图控制器时。
并且 BViewController 的视图将子视图添加到 AViewController 的视图中。
和 BViewController 中的 presentModalViewController:UIImagePickerController
。
UIImagePicker 视图在横向模式下看起来会很奇怪。
解决这个问题的方法是在presentModelViewController之前设置UIImagePickerController
为根视图控制器。
下面的源代码显示了细节:
- (void) onCameraButtonTapped:(UIBarButtonItem *)buttonItem
//backupRootController it's use as a backup, it will recover after close the image picker controller.
self.backupRootController = [[UIApplication sharedApplication] keyWindow].rootViewController;
UIImagePickerController * imageController = [[UIImagePickerController alloc] init];
imageController.sourceType = UIImagePickerControllerSourceTypeCamera;
imageController.delegate = self;
....
[[[UIApplication sharedApplication] keyWindow] setRootViewController:imageController];
[self presentModalViewController:imageController animated:YES];
[imageController release];
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
[[[UIApplication sharedApplication] keyWindow] setRootViewController:self.backupRootController];
....
我希望这个解决方案将来可以帮助其他人。 --戈曼
【讨论】:
【参考方案5】:在UIImagePickerController
上添加一个类别并覆盖它的shouldAutoRotateToInterfaceOrientation
方法,如下:
@implementation UIImagePickerController (NoRotate)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
return (interfaceOrientation == UIInterfaceOrientationPortrait);
@end
【讨论】:
我创建了两个文件:UIIMagePickerController+NoRotate.h 和 .m。我已将此添加到.m,我已将文件包含在调用 UIImagePickerController 但选择器仍在旋转的 viewController 中。我需要对选择器进行子类化吗?谢谢。 你应该不需要,让我试试,我会回复你。 这是针对 iPhone 应用还是 iPad 应用,UIImagePickerController 使用什么 sourceType?当我在带有 UIImagePickerControllerSourceTypePhotoLibrary 的 iPhone 上尝试此操作时,它似乎无论如何都无法在横向环境中工作。 iphone 应用程序,来源 = 相机,而不是库。 @Nick Lockwood:这在 iPad 上不适用于相机源。您还有其他解决方案吗?【参考方案6】:只需在视图控制器中编写此代码
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
// Return YES for supported orientations.
return (interfaceOrientation == UIInterfaceOrientationPortrait);
【讨论】:
[[UIDevice currentDevice]setOrientation:UIDeviceOrientationPortrait]; setOrientation 是一种私有方法 - 你不想在应用商店应用中使用它。【参考方案7】:-(BOOL)shouldAutorotate
return NO;
在你的视图控制器中试试这个。这对我有用。 注意:这是针对ios6.0及以上的
【讨论】:
【参考方案8】:不需要创建子类,只需要为uiimagepickercontroller创建一个category,把这一行放在上面 - (BOOL)应该自动旋转 返回否;
【讨论】:
以上是关于在 ios 应用程序中将 UIImagePickerController 锁定为纵向模式的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中将 AirPlay 集成到 iOS 应用程序