2013-09-25 34 views
7

自iOS7升级以来,我有一个奇怪的行为UIImagePickerController。在这个应用程序中,我使用UIImagePickerControllercameraOverlayViewUIImagePickerController不是全屏

_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; 

OverlayViewControllerUIViewController,具有透明背景,其利用了屏幕一些定制控件:

在iOS6的我用下面的代码称为UIImagePickerController

enter image description here

但现在的iOS 7相机通过状态栏和一个黑条绘制出现在实况摄像机视图下方。

我可以通过将CGAffineTransformMakeTranslation应用于UIImagePickerControllercameraViewTransform属性来解决此问题,但为什么会这样?

+0

会爱听取您是否能够在不改变的情况下修复它? – san

+0

你是否解决了这个问题? – KarenAnne

+0

@Wim Haanstra Hi..did你解决了这个问题吗? –

回答

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; 
     } 

再不用忘记在界面生成器中,有新的“iOS 6 delta”调整,可以让你设计iOS 7,然后使用偏移量来修正iOS 6.

无论如何,让我知道你是如何去的。

+0

第一个建议似乎没有做任何事情。也尝试将它应用于_picker,但这也不起作用。 第二个确实给了我正确的状态栏高度,但它似乎不是问题,因为相机的“图像”仍然很小(不足以填满整个屏幕)。 –

+0

您使用的是什么硬件? – iosengineer

+0

在另一个调查路径上,您可以安装Reveal并查看它是否让您更深入地了解问题。 http://bit.ly/183QpvK – iosengineer

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