【问题标题】:How do you target particular UIViews when styling its UIAppearance?在设置 UIAppearance 样式时如何定位特定的 UIView?
【发布时间】:2012-04-16 15:53:20
【问题描述】:

我在 iOS 5 中使用UIAppearance 设置全局样式。这是一个例子:

[[UIbarButtonItem appearance]
    setTtitletextAttributes:someStyle
    forState:UIControlStateNormal
];

在大多数情况下看起来不错:

但在某些情况下,全局样式看起来很难看,就像在电影播放器​​中一样。

对于电影播放器​​,我希望使用默认的蓝色按钮。那么我如何只针对后退按钮的外观而不是完成按钮的外观呢?我在定位普通表格单元格和分组表格单元格时遇到了类似的问题。

【问题讨论】:

  • 有什么方法可以在播放器显示之前和关闭之后调用 +appearance 吗?
  • 您可以尝试在该类中将 UIBBarutton 创建为 customView,这样 UIAppearence 代理就不会影响样式。

标签: iphone ios cocoa-touch ios5


【解决方案1】:

您实际上可以将代理更改为仅针对某些视图层次结构。换句话说,当您要自定义的视图包含在某个视图中时,您可以修改其外观与其他视图不同。因此,首先设置您的全局(白色)样式,然后调用以下方法来自定义按钮出现在MPMoviePlayerController 或其他任何内容中的外观。

[[UIBarButtonItem appearanceWhenContainedIn: 
      [MPMoviePlayerController class], nil] 
      setTitletextAttributes:someStyle
      forState:UIControlStateNormal];

如果有帮助,请告诉我!

【讨论】:

  • 失败并显示此消息:*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** MPMoviePlayerController 不符合 UIAppearanceContainer 协议”
  • 很公平。看了文档,才发现要使用真正符合 UIAppearanceContainer 协议的类,只有 UINavigationBar、UIButton 等。但同样的想法仍然适用
  • 除非你不能把这个想法应用到媒体播放器上。见openradar.appspot.com/11296843
【解决方案2】:

您需要使用UINavigationBar 的自定义子类。我们称之为MyNavigationBar。然后你可以这样做:

[[UIBarButtonItem appearanceWhenContainedIn:[MyNavigationBar class], nil]
    setTintColor:[UIColor redColor]];

它只会影响导航栏中的按钮,而不影响MPMoviePlayerController 的导航栏。

当然,问题在于UINavigationController 总是使用基本的UINavigationBar...如果您在代码中创建它。但是,如果您在 nib 中创建它,则可以单击其导航栏(在 nib 的文档大纲中)并在身份检查器中更改导航栏的类。

【讨论】:

  • 我不使用界面生成器。如何使整个应用程序中的所有navigationBars 都使用我的自定义子类?我没有明确地alloc 任何navigationBars。
  • 正如我所说,“如果您在代码中创建 UINavigationController,它总是使用基本的 UINavigationBar。”。没有公共 API 可以改变这一点。如果您想使用我的解决方案,您需要与 IB 友好相处。别担心,它不会咬人的。
  • 这个答案是正确的,似乎是唯一的解决方法。因为 Dylan 的答案是错误的,所以最初的提问者应该将此标记为正确答案。
  • @JoJo 其实从 iOS5 开始你可以使用 initWithNavigationBarClass:toolbarClass: 来让标准 UINavigationControllers 使用你指定的 bar 类
【解决方案3】:

如果在您的 AppDelegate 中您只需替换

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navback"]
                                   forBarMetrics:UIBarMetricsDefault];

[[UINavigationBar appearanceWhenContainedIn:[UINavigationController class], nil]
 setBackgroundImage:[UIImage imageNamed:@"navback"] forBarMetrics:UIBarMetricsDefault];

电影播放器​​在全屏模式下会有适当的黑条。适用于 iOS 5 和 iOS 6

【讨论】:

    猜你喜欢
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多