2013-09-25 93 views
7

Kể từ khi nâng cấp iOS7, tôi có một hành vi kỳ lạ của UIImagePickerController. Trong ứng dụng này tôi đang sử dụng UIImagePickerController với cameraOverlayView.UIImagePickerController không toàn màn hình

Trong iOS6 tôi gọi là UIImagePickerController sử dụng đoạn mã sau:

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

Trường hợp OverlayViewController là một UIViewController, với nền trong suốt mà rút ra một số điều khiển tùy chỉnh trên màn hình.

enter image description here

Nhưng bây giờ trong iOS 7 camera được rút ra qua statusbar và quầy bar màu đen xuất hiện dưới cái nhìn bức ảnh ấn tượng.

Tôi có thể giải quyết vấn đề này bằng cách áp dụng CGAffineTransformMakeTranslation cho thuộc tính cameraViewTransform của UIImagePickerController, nhưng tại sao lại như thế này?

+0

Rất thích để nghe nếu bạn có thể sửa nó mà không biến đổi? – san

+0

Bạn đã khắc phục sự cố chưa? – KarenAnne

+0

@Wim Haanstra Hi..did u đã vượt qua vấn đề này? –

Trả lời

1

Trong iOS 7, theo mặc định, lượt xem UIViewController chiếm toàn bộ khu vực màn hình bao gồm thanh trạng thái.

wantsFullScreenLayout 

không được chấp nhận và bỏ qua. Trong một số trường hợp, bản sửa lỗi này hoạt động (trong lớp bộ điều khiển chế độ xem):

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { 
    [self setEdgesForExtendedLayout:UIRectEdgeNone]; 
} 

Trong các trường hợp khác, nó phức tạp hơn một chút. Nó trễ ở đây, vì vậy hãy xem cách bạn đi với nó. điều hữu ích cần lưu ý - trong một UIViewController, đoạn code sau sẽ cung cấp cho chiều cao statusbar đúng trên cả iOS 6 và iOS 7, cần đến việc phải sắp xếp mọi thứ bằng CGRect toán:

if (UIDeviceOrientationIsLandscape(self.interfaceOrientation)) { 
      statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.width; 
     } else { 
      statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height; 
     } 

Và sau đó không quên rằng trong Interface Builder, có những điều chỉnh "iOS 6 delta" mới cho phép bạn thiết kế cho iOS 7 và sau đó sử dụng bù đắp để sửa cho iOS 6.

Dù sao đi nữa, hãy cho tôi biết cách bạn đi.

+0

Đề xuất đầu tiên dường như không hoạt động. Ngoài ra, hãy thử áp dụng nó cho _picker, nhưng điều đó cũng không hoạt động. Điều thứ hai thực sự mang lại cho tôi chiều cao thanh trạng thái chính xác, nhưng có vẻ như đó không phải là vấn đề, bởi vì "hình ảnh" của máy ảnh vẫn còn nhỏ (không đủ cao để lấp đầy toàn màn hình). –

+0

Phần cứng bạn đang sử dụng là gì? – iosengineer

+0

Trên một đường dẫn điều tra khác, bạn có thể cài đặt Hiển thị và xem liệu nó có cung cấp cho bạn thông tin chi tiết hơn về sự cố hay không. http://bit.ly/183QpvK – iosengineer

0

Sự hiểu biết của tôi về vấn đề này, dựa trên một vài chủ đề SO khác và đó là UIImagePickerController không làm những gì chúng tôi mong đợi về quản lý thanh trạng thái qua [UIViewController -prefersStatusBarHidden].

Điều này có nghĩa là bạn phải tắt hoàn toàn quản lý thanh trạng thái của trình điều khiển chế độ xem, thông qua plist hoặc tìm ra cách để nhận UIImagePickerController để thực hiện những gì chúng tôi muốn. Trên giả định rằng bạn không tìm kiếm cái cũ, tôi có thể nói rằng tôi đã thành công trong thứ hai bằng cách đặt bộ chọn trong bộ điều khiển trình bao làm những gì tôi muốn (nhưng quay lại mã trước nếu bạn vẫn cần phát hiện/hỗ trợ 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 

0

này sẽ làm việc cho bạn, camera thu nhỏ, bạn sẽ có một thanh màu đen ở phía dưới nhưng nó sẽ được overlayed bởi thanh công cụ https://stackoverflow.com/a/15803947