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)