【问题标题】:Customizing UIBarButtonItem with UIAppearance使用 UIAppearance 自定义 UIBarButtonItem
【发布时间】:2013-06-06 15:24:15
【问题描述】:

我正在尝试自定义一个嵌入在 UINavigationBar 中的 UIBarButtonItem

我想自定义背景图片以及标题文本属性。

但是,如果导航栏包含在 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,即使导航栏在弹出窗口中。但是当涉及到背景图像时,外观代理正确地应用了行 5,6)

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

我不明白为什么外观代理对后退按钮起作用,但不适用于我正在创建的UIBarButtonItem,当导航控制器处于弹出框时。

【问题讨论】:

    标签: ios objective-c uibarbuttonitem uiappearance


    【解决方案1】:

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

    在任何给定的视图层次结构中,最外层的外观代理获胜。 特异性(链的深度)是决胜局。换一种说法, appearanceWhenContainedIn: 中的包含语句被视为 偏序。给定一个具体的顺序(实际的子视图 层次结构),UIKit 选择第一个的偏序 从窗口向下读取实际层次结构时的唯一匹配。

    UIAppearance Protocol Reference

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多