相机图像选择器控件 - 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 图像选择器前置摄像头图像在选择时旋转

Winforms (.NET) 的屏幕截图选择器组件

如何以编程方式在 iPhone 相机中显示图像编辑控件

通过 UIImagePicker 中的 cameraOverlay 与相机控件交互

iOS7故事板图像选择器不工作:(

视觉软件halcon可以支持那些工业相机?