2013-06-06 5 views
1

Я пытаюсь настроить UIBarButtonItem, пока он встроен в UINavigationBar.Настройка UIBarButtonItem с UIAppearance

Я хотел бы настроить фоновое изображение, а также атрибуты текста заголовка.

Однако, если панель навигации содержится в файле UIPopoverController, я не хочу, чтобы эти настройки выполнялись.

Это мой код:

//1. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], nil] 
    setBackgroundImage:[UIImage imageNamed:@"navigationBarBackgroundNormal"] 
    forState:UIControlStateNormal 
    forBarMetrics:UIBarMetricsDefault]; 

//2. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], nil] 
    setBackgroundImage:[UIImage imageNamed:@"navigationBarBackgroundHighlighted"] 
    forState:UIControlStateHighlighted 
    forBarMetrics:UIBarMetricsDefault]; 

//3. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], nil] 
    setTitleTextAttributes:@{UITextAttributeTextColor:[UIColor blueColor]} 
    forState:UIControlStateNormal]; 

//4. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], nil] 
    setTitleTextAttributes:@{UITextAttributeTextColor:[UIColor whiteColor]} 
    forState:UIControlStateHighlighted]; 

//5. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], [UIPopoverController class], nil] 
    setBackgroundImage:nil 
    forState:UIControlStateNormal 
    forBarMetrics:UIBarMetricsDefault]; 

//6. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], [UIPopoverController class], nil] 
    setBackgroundImage:nil 
    forState:UIControlStateHighlighted 
    forBarMetrics:UIBarMetricsDefault]; 

//7. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], [UIPopoverController class], nil] 
    setTitleTextAttributes:nil 
    forState:UIControlStateNormal]; 

//8. 
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationController class], [UIPopoverController class], nil] 
    setTitleTextAttributes:nil 
    forState:UIControlStateHighlighted]; 

Проблема заключается в том:
создать навигационный контроллер в качестве contentViewController из в пирог.
При нажатии другого регулятора вида автоматически создается обратная кнопка, и внешний вид, который применяется, относится к строкам 5,6,7,8 - что хорошо.

Однако, когда я создаю новый UIBarButtonItem и назначаю его как rightBarButtonItem, вместо него применяются строки 3,4,5,6 (что означает, что прокси-сервер внешнего вида по какой-то причине применял атрибуты заголовка из строк 3,4 , хотя панель навигации находится в popover.Однако, когда дело доходит до фонового изображения, внешний вид прокси правильно применял линии 5,6)

Когда навигационная панель не находится в popover, все работает просто отлично (линии 1,2,3,4).

Я не могу понять, почему прокси-сервер внешнего вида работает так, как должен для кнопки «Назад», но не для UIBarButtonItem. Я создаю, когда навигационный контроллер находится в popover.

ответ

0

Я думаю, что этот пункт из документации поможет вам:

В любой иерархии представлений, внешний вид прокси выигрывает. Специфичность (глубина цепи) является тай-брейкером. Другими словами, заявление о сдерживании в видуWhenContainedIn: обрабатывается как частичный заказ. Учитывая конкретное упорядочение (фактическая иерархия subview), UIKit выбирает частичное упорядочение, которое является первым уникальным совпадением при чтении фактической иерархии из окна вниз.

UIAppearance Protocol Reference

Смежные вопросы