7

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

其中OverlayViewControllerUIViewController,具有透明背景,可在屏幕上绘制一些自定义控件。

在此处输入图像描述

但现在在 iOS 7 中,摄像头是通过状态栏绘制的,并且在实时摄像头视图下方会出现一个黑条。

我可以通过将 aCGAffineTransformMakeTranslation应用于 的cameraViewTransform属性来解决这个问题UIImagePickerController,但为什么会这样呢?

4

3 回答 3

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。

不管怎样,让我知道你怎么走。

于 2013-09-25T13:55:42.160 回答
0

这对你有用,缩放相机,底部会有一个黑条,但它会被工具栏覆盖 https://stackoverflow.com/a/15803947

于 2014-03-14T17:04:35.233 回答
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

于 2013-12-24T23:00:49.843 回答