UIImagePickerController interrompe l’aspetto della barra di stato

Nel mio file .plist, ho ” Visualizza aspetto barra di stato basata su controller ” impostato su NO . Ma dopo UIImagePickerController , la mia app si comporta come se l’opzione fosse impostata su YES .

Nella mia app, presento un VC che presenta un UIImagePickerController .

Il problema si presenta in questo modo:

  • Dopo che il photo picker è stato presentato, quando viene selezionata una libreria fotografica, il colore del testo della barra di stato cambia.
  • Quindi, una volta, UIImagePickerController viene rimosso, le modifiche alla spaziatura della barra di stato per il resto della mia app e tutte le barre di navigazione per gli altri controller vengono visualizzate sotto la barra di stato.

C’è un modo per risolvere questo problema senza gestire la barra di stato nei miei controller di visualizzazione?

Nessuna delle soluzioni sopra ha funzionato per me, ma combinando le risposte di Rich86man e iOS_DEV_09 ho una soluzione costantemente funzionante:

 UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init]; imagePicker.delegate = self; 

e

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarHidden:YES]; } 

Riguardo questa fantastica soluzione. Per il 2014 / iOS8 ho scoperto che in alcuni casi è necessario ANCHE includere prefersStatusBarHidden e, possibilmente, childViewControllerForStatusBarHidden So …

 -(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarHidden:YES]; } -(BOOL)prefersStatusBarHidden // iOS8 definitely needs this one. checked. { return YES; } -(UIViewController *)childViewControllerForStatusBarHidden { return nil; } -(void)showCamera { self.cameraController = [[UIImagePickerController alloc] init]; self.cameraController.delegate = (id)self; // dpjanes solution! etc... 

Spero che aiuti qualcuno

Ho affrontato lo stesso problema oggi. Ecco la mia soluzione.

Nel controller della vista che chiama il selettore di immagini, imposta te stesso come delegato del selettore di immagini. (Probabilmente lo stai già facendo)

 UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init]; imagePicker.delegate = self; 

Poiché UIImagePickerController è un tipo di controller di navigazione, ti stai anche impostando come delegato di UINavigationController. Poi :

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; } 

Sostituisci UIStatusBarStyleLightContent con qualsiasi stile tu stia cercando.

La risposta accettata funzionerà se l’aspetto della barra di stato ‘Visualizza controller-based’ è impostato su NO nel file .plist. Se in effetti è necessario controllare la barra di stato in alcuni altri controller di vista e avere questa opzione impostata su SÌ, l’altro modo per far si che UIImagePickerController si comporti correttamente è la sua sottoclassi

 // .h @interface MYImagePickerController : UIImagePickerController @end // .m @implementation MYImagePickerController - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; // change this to match your style } @end 

ho affrontato lo stesso problema.

ecco la mia soluzione. metti questo nella viewWillAppear del controller vista dal quale stai aprendo il picknote dell’immagine

 -(void) viewWillAppear:(BOOL)animated{ [super viewWillAppear:YES]; [[UIApplication sharedApplication] setStatusBarHidden:YES]; } 

Puoi provare questo. Penso che needStatusBarApperanceUpdate funzionerà.

 1 -Set UIViewControllerBasedStatusBarAppearance to NO. 2- Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 3- [self setNeedsStatusBarAppearanceUpdate]; 

Ho trovato questo per offrire una corretta gestione, ci sono due parti.

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque]; ... 

lo stesso UIImagePickerController presenta i controller di visualizzazione, quindi questo delegato funziona per tutti i relatori presenti nello stack.

viewWillAppear garantisce che questo controller di visualizzazione sia sempre resettato ogni volta che un controller di presentazione presenta il suo limite superiore.

Questo è probabilmente un bug. Ho risolto il problema impostando “Visualizza aspetto barra di stato basata su controller” impostato su SÌ e in ogni controller di visualizzazione incollando nel seguente codice:

 - (BOOL)prefersStatusBarHidden { return YES; } 

Quindi la mia app si comporta come previsto.

Per hide la barra di stato in UIImagePicker:

  (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; } 

e quando UIImagePicker viene chiuso per hide la barra di stato in View controller usa il seguente codice:

 -(void) viewWillAppear:(BOOL)animated{ [super viewWillAppear:YES]; [[UIApplication sharedApplication] setStatusBarHidden:YES]; } 

prova questo ….

questo funzionerà in entrambi i casi, vale a dire se si utilizza presentModalViewController e pushViewController

 UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; 

metodi delegati

 -(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info { [[UIApplication sharedApplication] setStatusBarHidden:YES]; [picker dismissViewControllerAnimated:YES completion:^{}]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [[UIApplication sharedApplication] setStatusBarHidden:YES]; [picker dismissViewControllerAnimated:YES completion:nil]; } 

Ho avuto lo stesso problema. Aggiungi info plist: “Visualizza aspetto barra di stato basata su controller” con valore “NO”

Esempio qui https://stackoverflow.com/a/19211669

Questa soluzione funziona per me.

Nessuna delle soluzioni di cui sopra ha funzionato per me.

Presento UIImagePickerController come controller di visualizzazione modale. Dopo aver rimosso UIImagePickerController lo stato della barra di stato era:

 [UIApplication sharedApplication].statusBarOrientation = 0 (UIDeviceOrientationUnknown) [UIApplication sharedApplication].statusBarFrame = { 0, 0, 0, 0} 

La soluzione che ha risolto il problema per me è stato il ripristino di StatusBarOrientation dopo aver eliminato UIImagePickerController:

 UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init]; [self.viewController presentViewController:cameraUI animated:true completion:^(void){ }]; ... [self.viewController dismissViewControllerAnimated:animated completion:^(void){ [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait; }]; 

Questo codice mi ha aiutato a personalizzare lo stile della barra di stato.

EDIT: questa soluzione funziona se “Visualizza aspetto barra di stato basata su controller” == SÌ

 @implementation UIImagePickerController (IOS7_StatusBarStyle) -(UIViewController*)childViewControllerForStatusBarStyle { return nil; } -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } @end 

Tutte le risposte sopra sono ok e possono aiutare.

Ho avuto lo stesso problema di dover gestire l’applicazione eseguita con diverse versioni di iOS .

 UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; if(IS_IOS8_AND_UP) { imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen; } else { imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext; } imagePickerController.delegate = self; [self presentViewController:imagePickerController animated:YES completion:nil]; 

Quindi, in delegato:

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { /* Cancel button color */ _imagePicker.navigationBar.tintColor =  /* Status bar color */ [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; } 

Ancora un’altra soluzione che può funzionare in alcune situazioni.

 let imagePicker = UIImagePickerController() imagePicker.sourceType = .PhotoLibrary imagePicker.navigationBar.barStyle = .Black 

Hai provato a chiamare [self setNeedsStatusBarAppearanceUpdate] quando riappare il tuo controller di visualizzazione?

Cerco di hide la barra di stato in UIImagePickerController in iOS7, ma non so ancora come farlo. Io uso

 - (void)viewWillAppear:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; } 

nel ViewController che chiama UIImagePickerController e imposta “Visualizza barra di stato basata su controller apparenza = NO” nel file plist. Spero che questo possa aiutare.

prova questo :

 UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; 

e nel protocollo implementare, utilizzare questo:

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarHidden:YES]; } 

Questo l’ha risolto per me …:

 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [[UIApplication sharedApplication] setStatusBarHidden:YES]; [picker dismissViewControllerAnimated:YES completion:nil]; } 

Niente qui ha risolto il problema in particolare (e forse anche l’OP stava avendo), quindi ho pensato di condividere la mia risposta. Invece di hide la barra di stato che penso sia una soluzione bacata (ho notato che a volte lasciava la mia app in uno stato in cui la barra di stato era nascosta quando non dovrebbe essere). Ho invece optato per provare a giocare bene con UIStatusBarStyles .

Quando UIImagePickerController ha la sua vista presentata, imposto lo stile della barra di stato come predefinito in quanto il colore di sfondo predefinito è un grigio chiaro.

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; } 

Quindi, quando il selettore di immagini viene UIStatusBarStyleLightContent lo UIStatusBarStyleLightContent a UIStatusBarStyleLightContent .

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { //work [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; [self dismissViewControllerAnimated:YES completion:NULL]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { //work [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; [self dismissViewControllerAnimated:YES completion:NULL]; } 

In questo caso, stiamo usando 2 passaggi

Nel primo passaggio: Aggiungi in info.plist: “Visualizza aspetto barra di stato basata su controller” con valore “NO”

In Secondo passaggio: Usa / chiama questo codice con il delegato di UIImagePickerController

  - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if([navigationController isKindOfClass:[UIImagePickerController class]]) [[UIApplication sharedApplication] setStatusBarHidden:YES]; } 

In caso di IOS-7 aggiungi un’altra funzione

 - (BOOL)prefersStatusBarHidden { return YES; } 

Tutto quanto sopra non ha funzionato per me. Ho risolto il problema cambiando lo stile di presentazione in:

 imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen; 

A partire da iOS 8.1, sembra che abbiano finalmente risolto questo bug! Sono stato in grado di rimuovere tutti i workaround che ho impiegato dal mio codice.

Usando il comportamento predefinito di iOS 8 stavo avendo problemi con la barra di stato che appare quando volevo che fosse nascosta.

La soluzione che ho trovato è che, subito dopo aver chiamato presentPopover dal mio controller di visualizzazione, ho fatto:

  [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate) withObject:nil afterDelay:0.01]; 

Ho anche dovuto aggiungere questo al mio controller di visualizzazione principale:

 - (UIViewController *)childViewControllerForStatusBarHidden { return nil; } 

Quindi ho avuto questo problema e sono stato in grado di risolverlo semplicemente implementando una singola funzione di delegato. Lo sfondo della mia barra di stato è nero, quindi UIStatusBarStyle per la mia applicazione è .LightContent. Quando ho presentato UIImagePickerController per selezionare una foto dalla memoria del dispositivo, la barra di stato andava bene. Tuttavia, facendo clic su una directory come “Rullino foto” o “Preferiti”, spingendo efficacemente sullo stack di navigazione, la barra di stato scompare. Dopo aver selezionato una foto, non c’era alcuna barra di stato; dopo aver ignorato un altro controller di visualizzazione modale, era presente solo la batteria, indicando che anche il resto della barra di stato potrebbe essere nero.

Ho provato alcune delle altre soluzioni come l’estensione di UIImagePickerController, ma in Swift non è ansible eseguire l’override utilizzando le estensioni. Ho quindi provato a sottoclass UIImagePickerController e ho cercato di hide la sua barra di stato su viewWillAppear () e di mostrare la barra di stato su viewWillDisappear. Sono stato in grado di vedere la barra di stato hide con un’animazione .Slide, ma poiché la barra di stato era invisibile dopo aver selezionato una directory, non ero in grado di vedere la barra di stato scoprire. Ancora una volta, la batteria verde tornò con il resto della barra di stato invisibile dopo aver scartato un controller di visualizzazione modale. Ho anche provato a sovrascrivere prefersStatusBarHidden (), ma quella funzione non è mai stata chiamata, quindi ho provato a chiamare setNeedsStatusBarAppearanceUpdate () per garantire che prefersStatusBarHidden () venga chiamato dal sistema, ma non viene ancora chiamato. Inoltre, vi è il suggerimento di impostare la barra di stato da hide sul metodo delegate navigationController willShowViewController. Ancora una volta, tutto ciò che fa è hide la barra di stato, che non risolve il problema. A quanto pare, sembra che lo stile della barra di stato sia cambiato quando si preme lo stack di navigazione di UIImagePickerController. Per risolvere completamente il problema, non ho dovuto scrivere estensioni o sottoclass UIImagePickerController. Tutto quello che devi fare è impostare il delegato e impostare lo stile della barra di stato per rimanere uguale. Questa aggiunta lo fece come se il problema non fosse mai esistito.

 let pickerController = UIImagePickerController() pickerController.delegate = self func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { UIApplication.sharedApplication().setStatusBarStyle(.LightContent, animated: false) } 

In realtà ho trovato un modo migliore per impostare il colore di sfondo della barra di stato in Image Picker. Fondamentalmente è necessario impostare l’immagine di sfondo dalla barra di navigazione a zero, perché di default in Image Picker ha un’immagine di sfondo come un’immagine bianca.