使用UIAppearance自定义UIBarButtonItem

时间:2013-06-06 15:24:15

标签: ios objective-c uibarbuttonitem uiappearance

我正在尝试在UIBarButtonItem嵌入UINavigationBar时自定义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]; 中,我不希望进行这些自定义。

这是我的代码:

UIBarButtonItem

问题是:
我创建了一个导航控制器作为popover的contentViewController 当按下另一个视图控制器时,会自动创建一个后退按钮,并且适用的外观来自第5,6,7,8行 - 这很好。

然而,当我创建一个新的rightBarButtonItem并将其指定为UIBarButtonItem时,将应用第3,4,5,6行(意思是,出于某种原因,外观代理应用了第3,4行的标题属性,即使导航栏位于弹出窗口中。但是当涉及到背景图像时,外观代理正确应用了行5,6)

当导航栏不在弹出窗口中时,一切正常(应用了1,2,3,4行)。

当导航控制器处于弹出框中时,我无法弄清楚外观代理为什么应该对后退按钮起作用,而不是我正在创建的{{1}}。

1 个答案:

答案 0 :(得分:0)

我认为文档中的这一段会帮助你:

  

在任何给定的视图层次结构中,最外层的外观代理获胜。   特异性(链条的深度)是决胜局。换一种说法,   外观中的包含声明如果被占用:被视为   部分订购。给出具体的排序(实际的子视图   层次结构),UIKit选择第一个部分排序   从窗口向下读取实际层次结构时的唯一匹配。

UIAppearance Protocol Reference