8

Ho creato uno UIAlertController con lo stile preferito di UIAlertControllerStyleAlert. L'avviso mostra quando viene toccato lo leftBarButtonItem. Ho creato una proprietà UIBarButtonItem denominata backButton e impostato il leftBarButtonItem = self.backButton. Questo funziona come progettato. Non sto usando gli storyboard.UIAlertController sposta a sinistraBarButtonItem in basso

Il problema è che leftBarButtonItem si sposta verso il basso (la mia ipotesi: circa 20 punti) quando viene visualizzato l'avviso. Perché sta succedendo?

So come mostrare/nascondere il pulsante in modo che l'utente non possa vedere quel pulsante quando si è spostato verso il basso. Tuttavia, questo fa schifo. Perché sta succedendo in primo luogo?

Non ho trovato qualsiasi simili problemi online.

@property (strong, nonatomic) IBOutlet UIBarButtonItem *backButton; 

in viewDidLoad:

self.backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonPressed)]; 
[self.backButton setImage:[UIImage imageNamed:@"back-arrow-grey"]]; 
self.navigationItem.leftBarButtonItem = self.backButton; 

in backButtonPressed:

{ 
    self.navigationItem.leftBarButtonItem = nil; //to hide backButton because it moves down 
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"My title" preferredStyle:UIAlertControllerStyleAlert]; 

    UIAlertAction *actionLeave = [UIAlertAction actionWithTitle:@"Leave" style:UIAlertActionStyleDefault handler:...//which works correctly 

    UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"Go back" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
     self.navigationItem.leftBarButtonItem = self.backButton; //to show backButton again now that the alert is dismissed 
     //other things happen here that work as designed 
    }]; 

    [alertController addAction:actionLeave]; 
    [alertController addAction:actionCancel]; 
    [self presentViewController:alertController animated:YES completion:^{}]; 
} 
+1

Nessuna idea, ma 20pts è la dimensione della barra di stato per me, quindi questo è il primo posto che guarderei. – dstudeba

risposta

13

Ho anche incontrato questo problema. La ricerca di altri problemi relativi al posizionamento errato verticale dell'elemento del pulsante sulla barra sinistra mi ha portato a this question. Il nocciolo di ciò è che questo problema si verifica, per ragioni sconosciute, se si dispone di un elemento del pulsante di barra che ha un'immagine, ma una stringa vuota come è il titolo. Impostare il titolo in un singolo spazio invece di una stringa vuota:

self.backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:self action:@selector(backButtonPressed)]; 

non so se sarà risolvere il problema per voi, ma per lo più ha fatto per me - il pulsante fa ancora un leggero 'salto' animazione come se fosse appena creata (ma solo la prima volta che appare), ma rimane nella stessa posizione verticale.

Edit: Passando nil come il titolo rimuove anche l'animazione estranea. Sembra che questo sia solo una peculiarità di come iOS gestisce le stringhe di spaziatura come titoli.

+3

impostazione su zero risolto. Grazie mille! Che bug incredibilmente strano. = D – jungledev

+1

Ho rilevato questo errore non solo con AlertController. Molte grazie. – Andrew

+1

È così strano che la soluzione sia assegnare un valore al titolo. Grazie per l'aiuto! – BlackHatSamurai

1
barbutton.title = nil; 

Impostare il titolo nil e questo lavoro per me.