UIImagePickerController(使用相机作为源)在 iPad2 上自动旋转,我该如何停止它?

Posted

技术标签:

【中文标题】UIImagePickerController(使用相机作为源)在 iPad2 上自动旋转,我该如何停止它?【英文标题】:UIImagePickerController (using camera as source) does autorotate on iPad2, how do i stop it? 【发布时间】:2011-04-18 08:21:23 【问题描述】:

我正在尝试编写一个带有相机功能的应用程序,并使用叠加视图来装饰它。

这是我实现应用程序的方式: 我将 UIImagePickerController 用于用户获取相机所接收的内容,并将 UIImageView 作为子视图添加到 cameraOverlayView 上,以便它像这样工作: (图片http://www.manna-soft.com/test/uploads/UIImagePickerView-portrait.jpg)

这工作正常,直到 iPad2 到位...它像这样自动旋转并破坏布局: (图片http://www.manna-soft.com/test/uploads/UIImagePickerView-landscape.jpg)

UIImagePickerController 在 iphone、ipod touch 或原始 iPad 上从不旋转,但在 iPad2 上却可以。 UIImagePickerContrller 的类引用说它“仅支持纵向模式”,但发生的情况是它像那样自动旋转...... 有没有办法可以禁用自动旋转? 我尝试在显示 UIImagePickerController 的视图控制器的 shouldAutorotateToInterfaceOrientation: 方法中返回 NO,但它仍在旋转。

提前致谢。

【问题讨论】:

您是否碰巧找到了解决方案 我做了类似于 MarcVivet 的建议的事情,制作一个反向动画来对抗自转。我想我稍后会尝试你的解决方案,因为这样做看起来更整洁(我现在没有 ipad2 可以尝试)。 【参考方案1】:

可以在窗口中添加覆盖视图,然后可以将window.superview设置为cameraOverlayView。 在关闭 ModalController 时,可以从窗口中删除覆盖视图。

根据您的应用的结构,此解决方案的应用可能会有些棘手。

YourAppDelegate *appDelegate = (YourAppDelegate *) [[UIApplication sharedApplication] delegate];
[appDelegate.window addSubview:overlayView];
imagePickerController.cameraOverlayView = appDelegate.window.superview;


//When dismissing the UIImagePicker
 [self dismissModalViewControllerAnimated:YES];
 [OverlayView removeFromSuperview]; 

【讨论】:

我从来没想过这个...如果我在窗口上添加一个子视图,是不是它永远不会旋转(因为窗口不旋转)? 这个解决方案对我有用,但上面的 MarcVivet 没有。谢谢!【参考方案2】:

因为 UIImagePickerController 派生自 UINavigationController,而 UINavigationController 派生自 UIViewController,您可以查看 UIViewController 文档中的“Handling View Rotations”以查看该信息是否有帮助。

【讨论】:

我已经尝试继承 UIImagePickerController 并覆盖方法 shouldAutorotateToInterfaceOrientation: 以便它仅在纵向模式下返回 YES ......但它不起作用,该方法在控制台打印一些东西时被调用,我发现该方法根本没有被调用....知道为什么会这样吗?【参考方案3】:

当你这样做时,你会注意到:

UIImagePickerController *camera = [UIImagePickerController new];
NSLog([self.camera shouldAutorotate] ? @"YES" : @"NO");

结果是肯定的。我认为默认情况下,它设置为 YES。

您可以继承 UIImagePickerController 并添加此方法来覆盖该方法:

- (BOOL)shouldAutorotate
return NO;

然后,不要使用 UIImagePickerController,而是使用您创建的子类。

UIImagePickerSubclass *camera = [UIImagePickerSubclass new];

希望这会有所帮助:)

【讨论】:

【参考方案4】:

您可以通过旋转 UIImagePickerController 的覆盖视图来补偿 ipad 的旋转。首先,您必须使用以下方法捕获通知:

[[NSNotificationCenter defaultCenter]     addObserver:self selector:@selector(notificationCallback:) name:nil object:nil];

然后使用这个代码:

 - (void) notificationCallback:(NSNotification *) notification 
  if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    if ([[notification name] isEqualToString:@"UIDeviceOrientationDidChangeNotification"])  

        UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

        switch ( orientation ) 
            case UIInterfaceOrientationLandscapeRight:
                NSLog(@"LandcapeRight");
                [UIView beginAnimations:@"LandscapeRight" context:UIGraphicsGetCurrentContext()];
                [UIView setAnimationDuration:0.4];
                m_uiCameraOverlayView.transform = CGAffineTransformIdentity;
                [UIView commitAnimations];
                break;
            case UIInterfaceOrientationLandscapeLeft:
                NSLog(@"LandscapeLeft");
                [UIView beginAnimations:@"LandcapeLeft" context:UIGraphicsGetCurrentContext()];
                [UIView setAnimationDuration:0.4];
                m_uiCameraOverlayView.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(M_PI), 0, 0);
                [UIView commitAnimations];
                break;
            case UIInterfaceOrientationPortraitUpsideDown:
                NSLog(@"UpsideDown");
                [UIView beginAnimations:@"UpsideDown" context:UIGraphicsGetCurrentContext()];
                [UIView setAnimationDuration:0.4];
                m_uiCameraOverlayView.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(-M_PI / 2), -128, -128);
                [UIView commitAnimations];
                break;
            case UIInterfaceOrientationPortrait:
                NSLog(@"Portrait");
                [UIView beginAnimations:@"Portrait" context:UIGraphicsGetCurrentContext()];
                [UIView setAnimationDuration:0.4];
                m_uiCameraOverlayView.transform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(M_PI / 2), 128, 128);
                [UIView commitAnimations];
                break;
            default:
                NSLog(@"????");
                break;
        
    
 

【讨论】:

这就是我现在正在做的事情,虽然代码很长,但它为我完成了工作。我没有使用通知中心,而是在 willRotateToInterfaceOrientation:duration: 方法中实现了代码,这样我就可以准确地知道进行轮换所需的时间。 我根据您的建议和 Eric 的建议进行了尝试,但两种方法都不起作用。在 iPad 2 上,我收到很多 UIDeviceOrientationDidChangeNotifications,每次旋转时至少有 2 个,并且旋转从未正确保持。 此代码仅适用于横向,如果您想使用纵向模式,您必须更改转换... ¬_¬

以上是关于UIImagePickerController(使用相机作为源)在 iPad2 上自动旋转,我该如何停止它?的主要内容,如果未能解决你的问题,请参考以下文章

当 UIImagePickerController 弹出时,状态栏仅在 iOS7 中显示电池

UIImagePickerController:如何添加按钮并选择照片

如何在 UIImagePickerController 中显示视频或电影文件?

UIImagePickerController 以大写字母“USE_PHOTO”、“RETAKE”和图库图像“CAMERA_ROLL”显示文本?

SVG 覆盖在 UIImagePickerController 之上,UIImagePickerController 响应手势(iPhone/iOS)

UIImagePickerController 不是全屏