8

Ich habe eine UIAlertController mit dem bevorzugten Stil UIAlertControllerStyleAlert erstellt. Die Warnung zeigt an, wenn die leftBarButtonItem abgegriffen wird. Ich habe eine UIBarButtonItem Eigenschaft namens backButton erstellt und die leftBarButtonItem = self.backButton festgelegt. Dies funktioniert wie vorgesehen. Ich verwende keine Storyboards.UIAlertController verschiebt leftBarButtonItem nach unten

Das Problem ist, dass die leftBarButtonItem nach unten bewegt (meine Schätzung: etwa 20 Punkte), wenn die Warnung zeigt. Warum passiert dies?

Ich weiß, wie Sie die Schaltfläche anzeigen/ausblenden, so dass der Benutzer nicht sehen kann, dass die Schaltfläche nach unten verschoben wurde. Das ist aber scheiße. Warum passiert es überhaupt?

Ich habe nicht gefunden beliebig ähnliche Ausgaben 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

Keine Ahnung, aber 20pts ist die Größe der Statusleiste für mich, das ist der erste Ort, an dem ich aussehen würde. – dstudeba

Antwort

13

ich auch dieses Problem auftreten. Die Suche nach anderen Problemen bezüglich der vertikalen Fehlpositionierung des Elements der linken Leiste hat mich zu this question geführt. Der Kern davon ist, dass dieses Problem aus unbekannten Gründen auftritt, wenn Sie eine Bar-Schaltfläche haben, die ein Bild, aber eine leere Zeichenfolge als Titel hat. Stellen Sie den Titel zu einem einzigen Raum, anstatt nur einen leeren String:

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

Ich weiß nicht, ob es es für Sie zu beheben, aber es hat vor allem für mich - die Taste tut es immer noch einen leichten ‚Sprung‘ Animation, als ob sie neu erstellt wird (aber nur beim ersten Mal) - aber sie bleibt an derselben vertikalen Position.

Edit: Passing in nil als Titel entfernt auch die Fremd Animation. Es scheint, dass dies nur eine Besonderheit darin ist, wie iOS Whitespace Strings als Titel behandelt.

+3

Einstellung auf Null fixiert es. Vielen Dank! Was für ein unglaublich seltsamer Fehler. = D – jungledev

+1

Ich habe diesen Fehler nicht nur mit AlertController abgefangen. Danke vielmals. – Andrew

+1

Das ist so seltsam, dass die Korrektur darin besteht, dem Titel einen Wert zuzuweisen. Danke für die Hilfe! – BlackHatSamurai

1
barbutton.title = nil; 

Set title nil und das funktioniert für mich.