iOS7 UILabel采用相同的tintColor作为窗口

zan*_*ona 13 uibarbuttonitem uilabel tintcolor ios7

我知道,对于类元素UIButtonUIBarButtonItem他们自动承担window.tintColor作为主色,这会导致情况下,我在应用中的任何时间设置新的tintColor到窗口立即改变的.

我想知道是否有任何方法可以使UILabel元素遵循相同的模式,一旦创建它们会自动保持其默认颜色window.tintColor,如果window.tintColor在我的应用程序运行时间内随时更改也会导致UILabel自动更改tintColour?

我希望这是有道理的.

red*_*ulb 33

UILabels是的子类UIView,所以当你在iOS 7中运行时,它们将有一个tintColor属性,如果它们的色调设置为nil(默认值),它将从父视图继承该颜色.

来自Apple的文档:

默认情况下,视图的色调颜色为nil,这意味着视图使用其父色调.这也意味着当您向视图询问其色调颜色时,即使您尚未设置颜色值,它也始终返回颜色值.

但是,您还会询问"如果在我的应用运行时中随时更改window.tintColor也会导致自动更改UILabel tintColour吗?" Apple建议您在屏幕上显示项目时不要更改色调颜色:

通常,最好在视图在屏幕外时更改视图的色调颜色.

我猜这是因为没有保证所有各种UI元素都会检测到tintColor更改并更新其可见视图.然而,该UIView文件提出了一种解决方法,如果你要更新tintColor,而你UILables是在屏幕上:

要在此属性更改时刷新子视图呈现,请覆盖tintColorDidChange方法.

因此,只需确保调用tintColorDidChange当前屏幕上的任何视图tintColor,其父色​​视图的更改时应更新其色调颜色.

但为什么不UILabel更新他们的颜色?

所以上面的内容可以帮助你设置和更新各种各样tintColor的内容,但是你没有看到任何影响 - 为什么?

那与Apple设计的Tint所表明的有关.从人机界面指南:

颜色为用户提供了强大的交互性视觉指示

苹果摆脱了互动元素周围的边界和渐变,并用颜色取而代之 - 具体而言tintColor.背后的整个想法tintColor是,用户可以轻松获取它,而他们无法点击的东西则不会.

UILabel它不是一个交互元素 - 它是一个文本描述 - 所以Apple会让你设置tintColor它(就像任何UIView有一个tintColor),但设置tintColor不会改变它的绘制方式.

那你该怎么办?首先,请注意,不仅仅是按钮采用色调颜色可能是您的应用程序的一个糟糕的UI选择 - iOS 7用户和Apple应用程序审阅者都期望遵循这些规则.

所以你被迫保持你的UILabel色彩吗?

不 - 特别是如果你做"正确"的事情.Apple解释说:

在内容区域中,仅在必要时添加按钮边框或背景.条形图,操作表和警报中的按钮不需要边框,因为用户知道这些区域中的大多数项目都是交互式的.另一方面,在内容区域中,按钮可能需要边框或背景以将其与内容的其余部分区分开.

我建议你考虑你的应用程序的用户界面.如果您真的希望非tintColor互动元素与您的互动元素相同,那么请确保您使用更多内容,例如边框或背景颜色,以便您的用户(和Apple应用审阅者)知道什么是可点击的,哪些不是.

至于你应该如何更新颜色,你可以手动将textColor属性设置为你想要的任何颜色,或者你需要制作自己的UILabel覆盖子类- (void)tintColorDidChange来在textColor发送通知时更新属性 - 允许你拥有a UILabel其文本更新以匹配tintColor其父级.

我希望这有帮助!