UIImagePickerController interrompe l'aspetto della barra di stato


137

Nel mio file .plist, ho impostato " Visualizza l'aspetto della barra di stato basata sul controller " 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 così:

  • Dopo la presentazione del selettore foto, quando viene selezionata una libreria di foto, il colore del testo della barra di stato cambia.
  • Quindi, una volta UIImagePickerControllerrespinto, la spaziatura della barra di stato cambia per il resto della mia app e tutta la barra di navigazione per altri controller viene visualizzata sotto la barra di stato.

C'è un modo per risolverlo senza gestire la barra di stato nei miei controller di visualizzazione?


La risposta nel mio caso era legata ai controllori della vista dei bambini. Ho dovuto ricrearli invece di riutilizzarli.
Alex L,

7
Sembra davvero un bug di iOS 7, qualcuno ha presentato una segnalazione ad Apple?
Dan F,

stackoverflow.com/questions/21225978/… domanda simile con la soluzione semplice
Ting Wu

Ehi @AlexL, sai perché succede?
Shabarinath Pabba,

Risposte:


192

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

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

e

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

Per quanto riguarda questa fantastica soluzione. Per 2014 / iOS8 ho scoperto che in alcuni casi è necessario includere ANCHE prefersStatusBarHiddene, possibilmente, childViewControllerForStatusBarHiddenquindi ...

-(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


3
Questo è il trucco (come ha detto un Rich86man): "Dato che UIImagePickerController è un tipo di controller di navigazione, ti stai anche impostando come delegato UINavigationController."
Beto,

2
che dire dopo aver licenziato UIImaegPicker ..? ho impostato false la barra di stato, quindi lo sfondo diventa nero.
Nitin Gohel,

Hai il plist impostato secondo la domanda sopra?
dpjanes,

Hai notato il problema durante l'utilizzo di UIImagePickerControllerSourceTypePhotoLibrary, l'apertura di un album, il panning indietro un po 'e l'annullamento del gesto?
Kukosk,

3
Funziona, anche se la barra di stato si apre e si apre in modo molto a scatti. Ho presentato un bug con Apple.
jjxtra,

84

Ho affrontato questo stesso problema oggi. Ecco la mia soluzione

Nel controller di visualizzazione 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 UINavigationController. Poi :

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

Sostituisci UIStatusBarStyleLightContent con qualsiasi stile tu stia cercando.


10

La risposta accettata funzionerà se l'opzione "Visualizza aspetto della barra di stato basata sul controller" è impostata su NO nel file .plist. Se in effetti è necessario controllare la barra di stato in alcuni altri controller di visualizzazione e questa opzione è impostata su SÌ, l'altro modo per far funzionare correttamente UIImagePickerController è di sottoclassarlo

// .h
@interface MYImagePickerController : UIImagePickerController
@end

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

6

ho affrontato lo stesso problema.

ecco la mia soluzione. mettere questo nella viewWillAppear del controller di visualizzazione da cui si sta aprendo il pickerview immagine

-(void) viewWillAppear:(BOOL)animated{
[super viewWillAppear:YES];

[[UIApplication sharedApplication] setStatusBarHidden:YES];

}

4

Puoi provare questo. Penso che abbia bisogno diStatusBarApperanceUpdate funzionerà.

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

4

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];
...

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

viewWillAppear garantisce che questo controller di visualizzazione stesso venga sempre reimpostato ogni volta che un controller di visualizzazione presentante viene eliminato sopra di esso.


3

Ho avuto lo stesso problema. Aggiungi nella finestra informazioni: "Visualizza l'aspetto della barra di stato basata su controller" con valore "NO"

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

Questa soluzione funziona per me.


2

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

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

Quindi la mia app si comporta come previsto.


2

Per nascondere la barra di stato in UIImagePicker:

-

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

e quando UIImagePicker viene eliminato per nascondere la barra di stato in Visualizza controller, utilizzare il seguente codice:

-(void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:YES];

    [[UIApplication sharedApplication] setStatusBarHidden:YES];

}

2

prova questo ....

questo funzionerà in entrambi i casi, ad esempio se si utilizzano 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];
}

2

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

imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;

2

Nessuna delle soluzioni sopra ha funzionato per me.

Presento UIImagePickerController come controller di visualizzazione modale. Dopo aver eliminato 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 è stata 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;
}];

2

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

EDIT: questa soluzione funziona se "Visualizza l'aspetto della barra di stato basata sul controller" == SÌ

@implementation UIImagePickerController (IOS7_StatusBarStyle)

-(UIViewController*)childViewControllerForStatusBarStyle
{
   return nil;
}

-(UIStatusBarStyle)preferredStatusBarStyle
{
   return UIStatusBarStyleLightContent;
}

@end

2

Tutte le risposte sopra sono ok e possono aiutare.

Ho avuto lo stesso problema dovendo gestire l'applicazione gestita 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 = <custom_color>
    /* Status bar color */
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}

2

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

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

1

Hai provato a chiamare [self setNeedsStatusBarAppearanceUpdate]quando ricompare il controller della vista di presentazione?


Probabilmente è un bug allora - vorrei archiviare un radar con un progetto di esempio e tornare al vecchio sistema di gestione della barra di stato :(
Ash Furrow

1

Provo a nascondere la barra di stato in UIImagePickerController in iOS7, ma ancora non so come farlo. Io uso

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

nel ViewController che chiama UIImagePickerController e imposta "Visualizza aspetto della barra di stato basata sul controller = NO" nel file plist. Spero che questo possa aiutare.


1

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

1

Questo ha risolto il problema per me ...:

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

1

Niente qui ha risolto in modo specifico il problema in quello che stavo avendo (e forse anche quello dell'OP), quindi ho pensato di condividere la mia risposta. Invece di nascondere la barra di stato che penso sia una soluzione errata (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 ilUIStatusBarStyles .

Quando UIImagePickerController presenta la sua vista, ho impostato lo stile della barra di stato sul valore predefinito poiché 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 ignorato, l'ho impostato su 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];
}

1

In questo caso, stiamo usando 2 passaggi

Nel primo passaggio: aggiungi info.plist: "Visualizza l'aspetto della barra di stato basata sul controller" con valore "NO"

Nel secondo passaggio: utilizzare / chiamare 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]; 
 }

Nel caso di IOS-7 aggiungere un'altra funzione

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

1

A partire da iOS 8.1, sembra che abbiano finalmente risolto questo bug! Sono stato in grado di rimuovere tutte le soluzioni alternative che ho impiegato dal mio codice.


1

Utilizzando il comportamento predefinito di iOS 8, ho riscontrato problemi con la barra di stato visualizzata quando volevo che fosse nascosta.

La soluzione che ho trovato è stata che, subito dopo aver chiamato presentPopoverdal mio view controller, 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;
}

1

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 fotografico" o "Preferiti", spingendo efficacemente nello stack di navigazione, la barra di stato scompare. Dopo aver selezionato una foto, non c'era alcuna barra di stato; dopo aver eliminato un altro controller di visualizzazione modale, era presente solo la batteria, a indicare 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 è possibile eseguire l'override utilizzando le estensioni. Ho quindi provato a sottoclassare UIImagePickerController e ho cercato di nascondere la sua barra di stato su viewWillAppear () e di scoprire la barra di stato su viewWillDisappear. Sono stato in grado di vedere la barra di stato nascosta con un'animazione .Slide, ma poiché la barra di stato era invisibile durante la selezione di una directory, non ero in grado di vedere la barra di stato da scoprire. Ancora una volta, la batteria verde è tornata con il resto della barra di stato invisibile dopo aver eliminato 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 assicurarmi che prefersStatusBarHidden () sia chiamato dal sistema, ma non viene ancora chiamato. Anche, vi è il suggerimento di impostare la barra di stato da nascondere sul metodo delegato navigationController willShowViewController. Ancora una volta, tutto ciò che fa è nascondere la barra di stato, che non risolve il problema. A quanto pare, sembra che lo stile della barra di stato cambi quando viene inserito nello stack di navigazione di UIImagePickerController. Per risolvere del tutto il problema, non ho dovuto scrivere estensioni o sottoclassi di UIImagePickerController. Tutto quello che devi fare è impostare il delegato e impostare lo stile della barra di stato in modo che rimanga lo stesso. Questa aggiunta ha reso come se il problema non fosse mai esistito. sembra che lo stile della barra di stato cambi quando viene inserito nello stack di navigazione di UIImagePickerController. Per risolvere del tutto il problema, non ho dovuto scrivere estensioni o sottoclassi di UIImagePickerController. Tutto quello che devi fare è impostare il delegato e impostare lo stile della barra di stato in modo che rimanga lo stesso. Questa aggiunta ha reso come se il problema non fosse mai esistito. sembra che lo stile della barra di stato cambi quando viene inserito nello stack di navigazione di UIImagePickerController. Per risolvere del tutto il problema, non ho dovuto scrivere estensioni o sottoclassi di UIImagePickerController. Tutto quello che devi fare è impostare il delegato e impostare lo stile della barra di stato in modo che rimanga lo stesso. Questa aggiunta ha reso 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)
    }

-1

In realtà ho trovato un modo migliore per impostare il colore di sfondo della barra di stato nel Selettore immagini. Fondamentalmente è necessario impostare l'immagine di sfondo dalla barra di navigazione su zero, poiché l'impostazione predefinita in Selezione immagine ha un'immagine di sfondo come immagine bianca.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.