UIBarButtonItem проблема появления в iOS 7, это может быть ошибка Apple?

Я видел статью некоторое время назад, которая здесь:

Настройка пользовательского интерфейса в iOS 6

Это показывает настройку для iOS 6. Так как в статье я написал Приложения, использующие эту технику, это довольно просто, никакой магии там нет.

Однако мне нужно обновить одно из моих приложений, и в iOS 7 оно работает неправильно. Похоже, что настройка UIBarButtonItems не работает при первом представлении представления. Если я отклоняю представление и затем представляю его снова, все работает отлично. То, что видно, показано здесь:

Первый взгляд представлен:

Второй раз:

Я видел эту проблему в его примере, моем коде и тестовом приложении, которое я написал. Код выглядит следующим образом:

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

Как вы можете видеть, здесь нет настоящей магии, довольно стандартного, но я не могу найти никаких причин или объяснений, почему это не работает в iOS 7. Код выполняется в- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions.

Я надеюсь, что кто-то видел это и может предложить решение. Спасибо за любую помощь!

** Примечание: было предложено, что это не ошибка яблока, а по замыслу. Я не говорю, что это проблема Apple, скорее всего, это моя проблема, но если вы запустите образец или скопируете приведенный ниже код, очевидно, что в первый раз он работает некорректно, а в последующие - нет. Это заставило бы меня поверить, что вызовы API действительны, но либо у них есть ошибка, либо я что-то упускаю, что нужно сделать.

**** ОБНОВЛЕНИЕ 4: **

Я изменил код в методе init MyAppDelegate в моем примере на следующий, основываясь на предложении FruityGeek, но все же не повезло:

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

**** ОБНОВЛЕНИЕ 3: **

Я добавил ссылку на Dropbox в пример проекта. Это в дополнение к уже размещенной ссылке выше, которая представляет собой простое приложение, которое также показывает проблему. Оба могут быть построены и запущены в симуляторе с iOS 6 и iOS 7. В случае с iOS 6 все работает как положено. В iOS 7, если вы щелкнете по ячейке таблицы и представите следующий вид, пользовательская кнопка «Назад» не отобразится, если вы вернетесь и снова представите ее, кнопка будет там.

Я дурачился с этим в течение нескольких дней, поэтому я надеюсь, что кто-то еще увидит это и скажет мне, что мне не хватает.

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

Это может быть глупо, но может ли это иметь отношение к моим изображениям? Я попробую образец с разными изображениями и выложу обновление.

Пробовал с разными изображениями, и это не имеет значения, также используются изображения из приведенного выше образца. Это был долгий путь, но, поскольку никто, похоже, не имел лучшей идеи, все же стоило попробовать.

**** ОБНОВЛЕНИЕ 2: **

Я попробовал это в другом тестовом приложении и перенес код в инициализированный делегат приложения, и он все еще не работает. Я разместил это здесь, а также оригинальный сайт авторов по ссылке вверху. Плюс еще один форум, но, похоже, ни у кого нет решения.

Мне интересно, может ли это быть ошибка Apple?

**** ОБНОВЛЕНИЕ 1: **

Код перенесен изdidFinishLaunchingWithOptions вwillFinishLaunchingWithOptions а такжеinit и он все еще не работает.

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

Ответы на вопрос(5)

Ваш ответ на вопрос