相机图像选择器控件 - iOS7 中的自动旋转
Posted
技术标签:
【中文标题】相机图像选择器控件 - iOS7 中的自动旋转【英文标题】:Camera Image Picker controls - Auto Rotation in iOS7 【发布时间】:2013-09-16 09:36:48 【问题描述】:我有一个照片应用程序,它覆盖了相机图像选择器上的自定义按钮(用于拍照、打开/关闭闪光灯、其他常用操作等)
我希望控制界面只支持纵向(我说的是控制按钮/界面,而不是实际捕获的图像),这在 ios 6 之前都可以正常工作。
但是,在升级到 xCode 5.0 版并将我的 iPad 3 升级到 iOS 7(GM Seed,适用于 iPad WiFi 第 3 代)后,我发现相机选择器界面会在方向改变时自动旋转。令人惊讶的是,我在 iPhone 5(升级到 iOS 7)上测试了相同的版本,但自动旋转问题并没有表现出来。
[再次确定,我在 iOS 6 中再次测试了同一段代码,但在 iPhone 或 iPad 中都没有发生自动旋转]。
只是为了演示我如何处理我的图像选择器,这里有一些代码 sn-p:
UIImagePickerController *pickercustom = [[UIImagePickerController alloc] init];
pickercustom.sourceType = UIImagePickerControllerSourceTypeCamera;
pickercustom.showsCameraControls = NO;
pickercustom.wantsFullScreenLayout = YES;
pickercustom.navigationBarHidden=YES;
pickercustom.view.userInteractionEnabled=YES;
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
if (IPAD.userInterfaceIdiom == UIUserInterfaceIdiomPad)
pickercustom.delegate = self;
UIDevice *currentDevice = [UIDevice currentDevice];
while ([currentDevice isGeneratingDeviceOrientationNotifications])
[currentDevice endGeneratingDeviceOrientationNotifications];
[self presentViewController:pickercustom animated:YES completion:nil];
while ([currentDevice isGeneratingDeviceOrientationNotifications])
[currentDevice endGeneratingDeviceOrientationNotifications];
else
pickercustom.delegate = self;
[self presentViewController:pickercustom animated:YES completion:nil];
添加了“endGeneratingDeviceOrientationNotifications”以阻止界面旋转(迄今为止效果很好)。
我也尝试在阅读后添加这三个方法:UIImagePickerController in iOS 6 doesn't work properly
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
return (interfaceOrientation == UIInterfaceOrientationPortrait);
- (BOOL)shouldAutorotate
return NO;
- (NSUInteger)supportedInterfaceOrientations
return UIInterfaceOrientationMaskPortrait;
...但这也许是 iOS 6 特定的解决方案。在我的情况下它不起作用。
如果您能找出根本原因,请告诉我。这将是很大的帮助。
【问题讨论】:
你找到解决办法了吗? 【参考方案1】:你很接近。当你想支持旋转但又想让 一个 viewController 不旋转时,事情就变得棘手了:
UIResponder 链确实希望整个应用程序具有相同的旋转。只是简单地覆盖单个类中的旋转委托方法是行不通的。 (仅供参考,在您的情况下,您需要子类化 UIImagePickerController 才能添加这些方法。)您需要在根导航控制器中实现这些委托方法(您需要再次拥有自己的子类),并且覆盖它们以查询最顶层的 viewController 以获得所需的旋转。比如:
// Handles the should Auto Rotation for all view controllers
- (BOOL)shouldAutorotate
if ([self.topViewController conformsToProtocol:@protocol(CustomRotation)])
return [self.topViewController shouldAutorotate];
// Auto rotate the screen by default.
return YES;
// Handles the supported Interface Orientations for all View Controllers by seeing if
// the top level viewController responds to Custom Rotation callbacks.
- (NSUInteger)supportedInterfaceOrientations
if ([self.topViewController conformsToProtocol:@protocol(CustomRotation)])
return [self.topViewController supportedInterfaceOrientations];
// The default rotation for the application.
return UIInterfaceOrientationMaskAll;
您不能使用respondsToSelector:
代替conformsToProtocol:
,因为对于派生自UIResponder
的任何类,选择器方法将始终返回YES
(就像所有东西一样),并且您必须重写项目中每个 UIViewController 上的旋转委托来完成这项工作。相反,您可以创建一个空白协议 (CustomRotation
)。在您的自定义轮换类中,需要该协议并包含您在上面的重写轮换委托方法,以及您想要的限制。
最后确保在 xcode 和/或 Application: didFinishLaunchingWithOptions
方法中正确设置支持的界面方向。
【讨论】:
【参考方案2】:据我为同一主题所做的研发,IOS7 iPad中的Imagepicker Camera默认界面可以将方向更改为横向。他们以这种方式设计了界面。我们无法强制锁定它的方向。
如果仍然愿意,您必须使用自定义 ImagePicker 使用 AVCam https://developer.apple.com/library/ios/samplecode/avcam/Introduction/Intro.html
和自定义图像选择器... http://www.codza.com/custom-uiimagepickercontroller-camera-view
并强行锁定方向...
【讨论】:
以上是关于相机图像选择器控件 - iOS7 中的自动旋转的主要内容,如果未能解决你的问题,请参考以下文章
Swift 2.0 Xcode 7.1 图像选择器前置摄像头图像在选择时旋转