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