Probleme mit der Darstellung von UIBarButtonItem in iOS 7, könnte dies ein Apple-Fehler sein?

Ich habe vor einiger Zeit einen Artikel gesehen, der hier ist:

Anpassung der Benutzeroberfläche in iOS 6

Es zeigt die Anpassung für iOS 6. Da ich in dem Artikel Apps geschrieben habe, die diese Technik verwenden, ist es ziemlich einfach, keine Magie drin.

Ich muss jedoch eine meiner Apps aktualisieren und unter iOS 7 funktioniert es nicht richtig. Es scheint, dass die Anpassung von UIBarButtonItems nicht funktioniert, wenn die Ansicht zum ersten Mal angezeigt wird. Wenn ich die Ansicht verwerfe und sie dann erneut präsentiere, funktioniert alles einwandfrei. Was gesehen wird, sehen Sie hier:

Die erste Ansicht wird präsentiert:

Zweites Mal:

Ich habe dieses Problem in seinem Beispiel, meinem Code und einer Test-App gesehen, die ich geschrieben habe. Der Code lautet wie folgt:

// Customizing the Back Bar Buttons
UIImage * btBack_30 = [[UIImage imageNamed:@"btBack_30"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 5)];
UIImage * btBack_24 = [[UIImage imageNamed:@"btBack_24"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 12, 0, 5)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:btBack_30 forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:btBack_24 forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone];

Wie Sie sehen, gibt es keine wirkliche Magie, ziemlich normal, aber ich kann keinen Grund oder eine Erklärung dafür finden, warum dies in iOS 7 nicht funktioniert. Der Code wird in ausgeführt- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions.

Ich hoffe das hat jemand gesehen und kann eine Lösung anbieten. Danke für jede Hilfe!

** Hinweis: Es wurde vorgeschlagen, dass es sich nicht um einen Apfel-Bug handelt, sondern um ein beabsichtigtes Problem. Ich sage nicht, dass es sich um ein Apple-Problem handelt, es könnte eher meins sein, aber wenn Sie entweder das Beispiel ausführen oder den folgenden Code kopieren und einfügen, ist es offensichtlich, dass es beim ersten Mal nicht richtig funktioniert, und beim nächsten Mal. Das würde mich glauben lassen, dass die API-Aufrufe gültig sind, aber entweder haben sie einen Fehler, oder ich vermisse etwas, das getan werden muss.

**** UPDATE 4: **

Ich habe den Code in der init-Methode von MyAppDelegate in meinem Beispiel wie folgt geändert, basierend auf dem Vorschlag von FruityGeek, aber immer noch kein Glück:

- (instancetype)init
{
    self = [super init];
    if (self)
    {
        //Other UIAppearance proxy calls go here

        [[UIBarButtonItem appearance] setTitleTextAttributes:
         [NSDictionary dictionaryWithObjectsAndKeys:
          //[UIColor colorWithRed:220.0/255.0 green:104.0/255.0 blue:1.0/255.0 alpha:1.0],
          [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0],
          UITextAttributeTextColor,
          //[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0],
          [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8],
          UITextAttributeTextShadowColor,
          [NSValue valueWithUIOffset:UIOffsetMake(0.5, 0.5)],
          UITextAttributeTextShadowOffset,
          [UIFont systemFontOfSize:12.0],
          UITextAttributeFont,
          nil]
                                                    forState:UIControlStateNormal];

        // Customizing the Back Bar Buttons
        //ios6 uses whole button background image
        UIImage * btBack_30 = [[UIImage imageNamed:@"btBack_30"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 5)];
        UIImage * btBack_24 = [[UIImage imageNamed:@"btBack_24"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 12, 0, 5)];
        [[UIBarButtonItem appearance] setBackButtonBackgroundImage:btBack_30 forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
        [[UIBarButtonItem appearance] setBackButtonBackgroundImage:btBack_24 forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone];

        if ([[UIDevice currentDevice].systemVersion integerValue] >= 7)
        {
            //ios7 needs additional chevron replacement image
            UIImage * chevronReplacement = chevronReplacement = [btBack_30 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
            UIImage * chevronTransitionMaskReplacement = chevronTransitionMaskReplacement = [btBack_30 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
            [[UINavigationBar appearance] setBackIndicatorImage:chevronReplacement];
            [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:chevronTransitionMaskReplacement];
        }
    }
    return self;
}

**** UPDATE 3: **

Ich habe einem Beispielprojekt einen Dropbox-Link hinzugefügt. Dies ist zusätzlich zu dem oben bereits geposteten Link, der eine einfache App ist, die auch das Problem zeigt. Beides kann im Simulator mit iOS 6 und iOS 7 erstellt und ausgeführt werden. Im Fall von iOS 6 funktioniert alles wie erwartet. Wenn Sie in iOS 7 auf die Tabellenzelle klicken und die nächste Ansicht anzeigen, wird die benutzerdefinierte Schaltfläche "Zurück" nicht angezeigt. Wenn Sie sie erneut anzeigen, befindet sich die Schaltfläche dort.

Ich habe tagelang damit herumgespielt, also hoffe ich, dass es jemand anderes sieht und mir sagen kann, was mir fehlt.

https://www.dropbox.com/s/oi1bh3emvtbmms0/NavigationBarDemo.zip

Das mag albern sein, könnte es aber mit meinen Bildern zu tun haben? Ich werde das Beispiel mit verschiedenen Bildern ausprobieren und ein Update posten.

Versucht mit verschiedenen Bildern und das macht keinen Unterschied, verwendet auch Bilder aus dem oben angegebenen Beispiel. Es war ein langer Versuch, aber da niemand eine bessere Idee zu haben scheint, war es einen Versuch wert.

**** UPDATE 2: **

Ich habe dies in einer anderen Test-App ausprobiert und den Code auf das Init des App-Delegaten verschoben, und es funktioniert immer noch nicht. Ich habe dies hier gepostet sowie die ursprüngliche Autorenseite des Links oben. Plus ein weiteres Forum, aber niemand scheint eine Lösung zu haben.

Ich frage mich, ob dies ein Apple-Fehler sein könnte.

**** UPDATE 1: **

Verschobener Code vondidFinishLaunchingWithOptions zuwillFinishLaunchingWithOptions undinit und es scheint immer noch nicht zu funktionieren.

***** INIT METHOD FROM AppDelegate.m

- (id)init
{
    // Create resizable images
    UIImage *gradientImage44 = [[UIImage imageNamed:@"navBar_44"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
    UIImage *gradientImage32 = [[UIImage imageNamed:@"navBar_32"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

    // Set the background image for *all* UINavigationBars
    [[UINavigationBar appearance] setBackgroundImage:gradientImage44 forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setBackgroundImage:gradientImage32 forBarMetrics:UIBarMetricsLandscapePhone];

    // Customize the title text for *all* UINavigationBars
    [[UINavigationBar appearance] setTitleTextAttributes:
     [NSDictionary dictionaryWithObjectsAndKeys:
      [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0],
      UITextAttributeTextColor,
      [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8],
      UITextAttributeTextShadowColor,
      [NSValue valueWithUIOffset:UIOffsetMake(1, 1)],
      UITextAttributeTextShadowOffset,
      [UIFont boldSystemFontOfSize:18.0],
      UITextAttributeFont,
      nil]];

    // Customizing the NavBar Buttons
    UIImage * button30 = [[UIImage imageNamed:@"btButton_30"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 5)];
    UIImage * button24 = [[UIImage imageNamed:@"btButton_24"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 5)];
    [[UIBarButtonItem appearance] setBackgroundImage:button30 forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [[UIBarButtonItem appearance] setBackgroundImage:button24 forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone];

    [[UIBarButtonItem appearance] setTintColor:[UIColor whiteColor]];

    [[UIBarButtonItem appearance] setTitleTextAttributes:
     [NSDictionary dictionaryWithObjectsAndKeys:
      //[UIColor colorWithRed:220.0/255.0 green:104.0/255.0 blue:1.0/255.0 alpha:1.0],
      [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0],
      UITextAttributeTextColor,
      //[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0],
      [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8],
      UITextAttributeTextShadowColor,
      [NSValue valueWithUIOffset:UIOffsetMake(0.5, 0.5)],
      UITextAttributeTextShadowOffset,
      [UIFont systemFontOfSize:12.0],
      UITextAttributeFont,
      nil]
                                                forState:UIControlStateNormal];

    // Customizing the Back Bar Buttons
    UIImage * btBack_30 = [[UIImage imageNamed:@"btBack_30"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 13, 0, 5)];
    UIImage * btBack_24 = [[UIImage imageNamed:@"btBack_24"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 12, 0, 5)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:btBack_30 forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:btBack_24 forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone];

    return [super init];
}

Antworten auf die Frage(5)

Ihre Antwort auf die Frage