2013-09-25 15 views
7

Od aktualizacji do iOS7, mam dziwne zachowanie UIImagePickerController. W tej aplikacji używam UIImagePickerController z cameraOverlayView.UIImagePickerController nie pełny ekran

W iOS6 Zadzwoniłem UIImagePickerController stosując następujący kod:

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

Jeżeli OverlayViewController jest UIViewController, z przezroczystym tłem, które przyciąga kilka kontrolek niestandardowych na ekranie.

enter image description here

Ale teraz w iOS 7 aparat jest zasysane przez pasku stanu i pojawia się czarny pasek pod żywo widoku kamery z.

Mogę rozwiązać ten problem, stosując CGAffineTransformMakeTranslation do właściwości cameraViewTransform z UIImagePickerController, ale dlaczego tak jest?

+0

Chcielibyśmy usłyszeć, czy jesteś w stanie to naprawić bez transformacji? – san

+0

Czy rozwiązałeś problem? – KarenAnne

+0

@Wim Haanstra Cześć. Przezwyciężyłeś ten problem? –

Odpowiedz

1

W iOS 7 domyślnie widoki UIViewController zajmują cały obszar ekranu, w tym pasek stanu.

wantsFullScreenLayout 

jest przestarzała i ignorowana. W niektórych przypadkach ta poprawka działa (w klasie kontrolera widoku):

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

W innych przypadkach jest to nieco bardziej skomplikowane. Jest już późno, więc zobacz, jak sobie z tym poradzisz. Pomocne rzeczy do uwaga - w UIViewController poniższy kod da prawidłową wysokość pasku stanu na obu iOS 6 i iOS 7, powinno dojść do konieczności wyrównać rzeczy za pomocą CGRect matematyki:

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

A potem nie robić zapomnij o tym, że w narzędziu do tworzenia interfejsu dostępne są nowe korekty "iOS 6", które pozwalają zaprojektować system iOS 7, a następnie użyć korekcji do poprawienia dla iOS 6.

W każdym razie, daj mi znać, jak idziesz.

+0

Pierwsza sugestia nie wydaje się nic robić. Próbowałem również zastosować go do _picker, ale to też nie działa. Druga istotnie daje mi prawidłową wysokość paska stanu, ale wygląda na to, że to nie problem, ponieważ "obraz" kamery jest nadal mały (niewystarczająco wysoki, aby wypełnić cały ekran). –

+0

Jaki sprzęt jest używany? – iosengineer

+0

Na innej ścieżce dochodzeniowej można zainstalować program Reveal i sprawdzić, czy zapewnia on lepszy wgląd w problem. http://bit.ly/183QpvK – iosengineer

0

Moje zrozumienie problemu, oparte na kilku innych wątkach SO i tym podobnych, polega na tym, że UIImagePickerController nie robi tego, czego oczekiwalibyśmy w zakresie zarządzania paskiem stanu poprzez [UIViewController -prefersStatusBarHidden].

Oznacza to, że trzeba całkowicie wyłączyć zarządzanie paskiem stanu kontrolera widoku, za pomocą plist, lub znaleźć sposób, aby uzyskać UIImagePickerController, aby zrobił to, co chcemy. Przy założeniu, że nie szukasz tego pierwszego, mogę powiedzieć, że odniosłem sukces w drugim, umieszczając próbnik w kontrolerze otoki, który robi to, co chcę (ale cofnij się do poprzedniego kodu, jeśli nadal potrzebujesz wykryć/support 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 

Powiązane problemy