自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
应用于cameraViewTransform
的{{1}}属性来解决此问题,但为什么会这样?
答案 0 :(得分: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。
无论如何,让我知道你是怎么走的。
答案 1 :(得分:0)
基于其他一些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
答案 2 :(得分:0)
这对你有用,缩放相机,底部会有一个黑色条,但它会被工具栏覆盖 https://stackoverflow.com/a/15803947