UIImagePickerController 不是全屏
Posted
技术标签:
【中文标题】UIImagePickerController 不是全屏【英文标题】:UIImagePickerController not full screen 【发布时间】:2013-09-25 13:28:05 【问题描述】:自从 ios7 升级后,UIImagePickerController
出现了奇怪的行为。在这个应用程序中,我使用 UIImagePickerController
和 cameraOverlayView
。
在 iOS6 中,我使用以下代码调用了UIImagePickerController
:
_picker = [[UIImagePickerController alloc] init];
if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear])
_picker.sourceType = UIImagePickerControllerSourceTypeCamera;
_picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
_picker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
_picker.showsCameraControls = NO;
_picker.navigationBarHidden = NO;
_picker.toolbarHidden = YES;
_picker.wantsFullScreenLayout = YES;
_overlayViewController = [[OverlayViewController alloc] init];
_overlayViewController.picker = _picker;
_overlayViewController.frameSize = self.frameSize;
_overlayViewController.delegate = self;
_picker.cameraOverlayView = _overlayViewController.view;
else
_picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
_picker.delegate = self;
其中OverlayViewController
是UIViewController
,具有透明背景,可在屏幕上绘制一些自定义控件。
但现在在 iOS 7 中,摄像头是通过状态栏绘制的,并且在实时摄像头视图下方会出现一个黑条。
我可以通过将CGAffineTransformMakeTranslation
应用于UIImagePickerController
的cameraViewTransform
属性来解决这个问题,但是为什么会这样呢?
【问题讨论】:
想知道您是否能够在不转换的情况下修复它? 问题解决了吗? @Wim Haanstra 嗨..你解决了这个问题吗? 【参考方案1】:在 iOS 7 中,默认情况下 UIViewController 视图占据整个屏幕区域,包括状态栏。
wantsFullScreenLayout
已弃用并被忽略。在某些情况下,此修复程序有效(在视图控制器类中):
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
[self setEdgesForExtendedLayout:UIRectEdgeNone];
在其他情况下,它有点复杂。来晚了,看你怎么玩。需要注意的有用事项 - 在 UIViewController 中,以下代码将在 iOS 6 和 iOS 7 上提供正确的状态栏高度,如果必须使用 CGRect 数学对齐事物:
if (UIDeviceOrientationIsLandscape(self.interfaceOrientation))
statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.width;
else
statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
然后不要忘记,在 Interface Builder 中,有新的“iOS 6 delta”调整,允许您针对 iOS 7 进行设计,然后使用偏移量来更正 iOS 6。
无论如何,让我知道你的情况。
【讨论】:
第一个建议似乎没有做任何事情。还尝试将其应用于_picker,但这也不起作用。第二个确实给了我正确的状态栏高度,但似乎这不是问题,因为相机的“图像”仍然太小(不足以填满全屏)。 您使用的是什么硬件? 在另一条调查路径上,您可以安装 Reveal,看看它是否能让您更深入地了解问题。 bit.ly/183QpvK 我在 iPhone 5 上使用 iOS7。 这里有同样的问题...想听听解决方案。【参考方案2】:基于其他一些 SO 线程等,我对该问题的理解是 UIImagePickerController 在通过[UIViewController -prefersStatusBarHidden]
管理状态栏方面没有达到我们的预期。
这意味着你要么必须通过 plist 完全禁用视图控制器状态栏管理,要么想办法让 UIImagePickerController 做我们想做的事。假设您不是在寻找前者,我可以说我在后者中取得了成功,方法是将选择器放入执行我想要的包装控制器中(但如果您仍然需要,请回退到您以前的代码检测/支持iOS6):
@interface PickerContainer : UIViewController
@property ( nonatomic, weak ) UIImagePickerController* picker;
@end
@implementation PickerContainer
- (void) setPicker: (UIImagePickerController*) picker
[self addChildViewController: picker];
[picker didMoveToParentViewController: self];
self->_picker = picker;
- (void) viewDidLoad
[super viewDidLoad];
self.picker.view.frame = self.view.bounds;
[self.view addSubview: self.picker.view];
// Will have no effect in ios6 -- see [-init] for that option
- (BOOL) prefersStatusBarHidden return YES;
- (id) init
if ( ! ( self = [super init] ) ) return nil;
if ( detectThatThisIsIos6() ) self.wantsFullScreenLayout = YES;
return self;
@end
【讨论】:
【参考方案3】:这对你有用,缩放相机,底部会有一个黑条,但它会被工具栏覆盖 https://***.com/a/15803947
【讨论】:
以上是关于UIImagePickerController 不是全屏的主要内容,如果未能解决你的问题,请参考以下文章
UIImagePickerController 预览大小与实时大小不一样
UIImagePickerController 在 iOS 13 中不返回实时照片
UIImagePickerController 不尊重 iPad 上的视频最长持续时间
UIImagePickerController 相机不提供 URL