Ich habe vor einer Weile einen Artikel gesehen, der hier ist:
Anpassung der Benutzeroberfläche in iOS 6
Es zeigt Anpassung für iOS 6. Seit dem Artikel habe ich Apps geschrieben, die die Technik verwenden, es ist ziemlich einfach, keine Magie drin.
Allerdings muss ich eine meiner Apps aktualisieren und unter iOS 7 funktioniert es nicht richtig. Anscheinend funktioniert die Anpassung von UIBarButtonItems nicht beim ersten Anzeigen der Ansicht. Wenn ich die Ansicht verwerfe und sie dann präsentiere, funktioniert alles gut. Was gesehen wird, wird hier gezeigt:
Die erste Zeitansicht wird angezeigt:
Zweites Mal:
Ich habe dieses Problem in seinem Beispiel, meinem Code und einer Test-App gesehen, die ich geschrieben habe. Der Code ist wie folgt:
%Vor% Wie Sie sehen können, gibt es keine echte Magie, sondern einen Standard, aber ich kann keinen Grund oder eine Erklärung finden, warum das in iOS 7 nicht funktioniert. Der Code wird in - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
ausgeführt.
Ich hoffe, dass jemand das gesehen hat und eine Lösung anbieten kann. Danke für jede Hilfe!
** Hinweis: Es wurde vorgeschlagen, dass dies kein Apfelwanze ist, sondern von Design. Ich sage nicht, dass es ein Apple-Problem ist, es könnte eher mein sein, aber wenn Sie entweder das Beispiel ausführen oder kopieren und den folgenden Code einfügen, ist es offensichtlich, dass das erste Mal es nicht richtig funktioniert und nachfolgende Male es tut. Das würde mich glauben machen, dass die API-Aufrufe gültig sind, aber entweder haben sie einen Fehler oder ich vermisse etwas, was getan werden muss.
**** UPDATE 4: **
Ich habe den Code in der MyAppDelegate init-Methode in meinem Beispiel nach dem Vorschlag von FruityGeek geändert, aber immer noch kein Glück:
%Vor%**** UPDATE 3: **
Ich habe einen Dropbox-Link zu einem Beispielprojekt hinzugefügt. Dies ist zusätzlich zu dem bereits veröffentlichten Link oben, der eine einfache App ist, die auch das Problem anzeigt. Beide können im Simulator mit iOS 6 und iOS 7 erstellt und ausgeführt werden. Im iOS 6-Fall funktioniert alles wie erwartet. Wenn Sie in iOS 7 auf die Tabellenzelle klicken und die nächste Ansicht anzeigen, wird die benutzerdefinierte Zurück-Schaltfläche nicht angezeigt. Wenn Sie zurückgehen und sie erneut anzeigen, ist die Schaltfläche vorhanden.
Ich habe seit Tagen mit solchen Dingen herumalbern, also hoffe ich, dass jemand anderes es sieht und mir sagen kann, was ich vermisse.
Das mag albern sein, aber könnte es mit meinen Bildern zu tun haben? Ich werde das Beispiel mit verschiedenen Bildern versuchen und ein Update veröffentlichen.
**** UPDATE 2: **
Ich habe das in einer anderen Test-App versucht und den Code in die init verschoben der App-Delegierte und es funktioniert immer noch nicht. ich habe das gepostet hier sowie die ursprüngliche Autoren Seite des Links an der oben. Plus ein anderes Forum, aber niemand scheint eine Lösung zu haben.
Ich frage mich, ob das ein Apple Bug sein könnte?
**** UPDATE 1: **
Code von didFinishLaunchingWithOptions
nach willFinishLaunchingWithOptions
und init
verschoben und es scheint immer noch nicht zu funktionieren.
Es sieht wie ein Apple-Bug aus, und Sie sollten einen Fehler mit dem Bug-Reporter eingeben. Das heißt, ich kann Ihnen eine relativ schmerzfreie Workaround geben: Fügen Sie diesen Code zu Ihrem RecipetTableViewController:
%Vor%BEARBEITEN: Sie können diesen Fehler duplexieren, wenn Sie interessiert sind, je mehr Fehler darauf hinweisen, desto wahrscheinlicher wird Apple den Fehler beheben:
BUG: 15506447
Status: OpenProduct: iOS
19-Nov-2013 03:53 PM
Zusammenfassung: Festlegen des UIBarButtonItem-Darstellungsproxys für die Rückleiste Button-Item hat keinen Einfluss bis zum zweiten Erscheinen von der Knopf.
Schritte zum Reproduzieren: Fügen Sie in appDelegate hinzu, bevor alles angezeigt wird diese Aussagen:
UIImage * gradientImage44 = [[UIImage imageNamed: @ "navBar_44"] resizableImageWithCapInets: UIEdgeInsetsMake (0, 0, 0, 0)]; UIImage * gradientImage32 = [[UIImage imageNamed: @ "navBar_32"] resizableImageWithCapInets: UIEdgeInsetsMake (0, 0, 0, 0)]; // Einstellen das Hintergrundbild für all UINavigationBars [[UINavigationBar Aussehen] setBackgroundImage: gradientImage44 forBarMetrics: UIBarMetricsDefault]; [[UINavigationBar Aussehen] setBackgroundImage: gradientImage32 forBarMetrics: UIBarMetricsLandscapePhone];
Erwartete Ergebnisse: Wenn ein viewController zum ersten Mal gedrückt wird, ist es zurück Taste hat das Bild drin.
Aktuelle Ergebnisse: Zum ersten Mal erscheint kein Bild. Drück den wieder sehen und es ist da. Tatsächlich erscheint es, wenn Sie auf klicken die Taste das erste Mal, aber nicht, wenn die Taste zuerst erscheint.
Version: Xcode 5.0.1, iOS 7.0.3
Hinweise: Hinzufügen im Root-View-Controller der Navigation Controller macht es funktioniert:
(void) viewDidLoad { [super viewDidLoad];
self.title = @ "Rezeptbuch"; UIBarButtonItem * it = [[UIBarButtonItem-Zuordnung] initWithTitle: self.title style: UIBarButtonItemStylePlain target: Keine Aktion: NULL]; UIImage * btBack_30 = [[UIImage imageNamed: @ "btBack_30"] resizableImageWithCapInsets: UIEdgeInsetsMake (0, 13, 0, 5)]; [es setBackButtonBackgroundImage: btBack_30 forState: UIControlStateNormal barMetrics: UIBarMetricsDefault]; self.navigationItem.backBarButtonItem = it; }
Angehängtes Demo-Projekt zeigt das Problem.
Konfiguration:
Anhänge: 'DynamicsCatalog.zip' wurde erfolgreich hochgeladen.
EDIT: Ich bin froh, das wieder zu sagen, Bugs im Bugreporter einzugeben, funktioniert manchmal!
Ich habe versucht, ein paar Dinge in Ihrem Demo-Projekt zu ändern, aber wie Sie gesagt haben, funktioniert nichts. Ich dachte, dass es vielleicht wegen der Unterklasse UINavigationController ist, aber die Verwendung einer Standard-Klasse hat das gleiche Verhalten.
Leider, wenn Sie wirklich Ihre Taste anzeigen müssen, würde ich beim Start das Öffnen-Schließen-Verhalten tun ... Entschuldigung für den hässlichen Vorschlag
Sie müssen das Zurück-Button-Element für iOS7 anders anpassen. Unter iOS6 war die Zurück-Schaltfläche eine umrandete Schaltfläche, die den Titel des vorherigen Bildschirms mit einem Hintergrundbild enthielt, das sich unter der gesamten Schaltfläche erstreckte.
Unter iOS7 ist das Zurück-Steuerelement ein Chevron-Bild und der Titel des vorherigen Bildschirms. Wenn Sie ein benutzerdefiniertes Bild verwenden möchten, um den Standard-Chevron zu ersetzen, müssen Sie auch ein benutzerdefiniertes Maskenbild erstellen. iOS 7 verwendet die Maske, damit der Titel des vorherigen Bildschirms während Navigationsübergängen aus dem Chevron hervortritt oder darin verschwindet.
Da Sie dies in einem Storyboard tun, sollten Sie die Darstellungsproxies am besten in der init-Methode Ihres Anwendungsdelegaten festlegen.
%Vor%Ich konnte das beheben, indem ich in der viewWillDisappear-Methode der Ansicht, die auf die Ansicht drückt, auf der ich die Zurück-Schaltfläche haben möchte, die Zurück-Schaltfläche anpassen. Der Grund dafür ist, dass die vorherige Ansicht die Zurück-Schaltfläche "besitzt", nicht die aktuelle Ansicht.
%Vor% This is not the bug. This is default apple's iOS7 behavior.
Mit iOS7 Aussehen müssen Sie den Hintergrund nicht einstellen. Wenn Sie möchten, können Sie dies jedoch mithilfe der benutzerdefinierten Leiste in der benutzerdefinierten Navigationsleiste erreichen.
Viel Spaß beim Programmieren!
Tags und Links objective-c iphone ios uiappearance uibarbuttonitem