如何防止使用UIAppearance和UIView的tintColor更改所有UITabBar图标颜色?

时间:2015-10-14 16:02:13

标签: ios cocoa-touch uiview uitabbar uiappearance

如果我执行UIView.appearance().tintColor = ...,标签栏中所有图标的tintColor从正常的非活动灰色状态变为我将色调颜色设置为的任何颜色。

我不明白为什么会这样。我只是改变应用程序的色调颜色,默认情况下,色调颜色并不会让所有标签栏图标立刻显示为活动状态。

如何阻止它这样做?我希望色调颜色可以更改,但未选中的选项卡可以保留非活动颜色。

2 个答案:

答案 0 :(得分:1)

我希望你现在已经找到了解决办法,但无论如何,这是我的两分钱。

Interface Builder不会在任何地方使用UIAppearance API(据我所知)。但是,它确实设置了某些对象的属性,以便在实例化时应用于它们。

文件检查器中有一个“全局色调”属性,用于控制顶级默认tintColor。值得注意的是,除非明确告诉使用不同的颜色(无论是通过UIView.appearance()还是仅UIView.tintColor),否则子视图会从其父视图继承其tintColor。请记住,此链在视图层次结构中继续向上,直到它遇到具有tintColor的内容。通常,它是UIWindow它最终击中,并且具有Apple非常喜欢的默认蓝色。对状态的任何调暗或临时重新着色都是从视图本身或接近的祖先继承的。这一点很重要。

还可以注意到,您可以通过覆盖UIViewController方法在tintColorChanged()中对此进行响应,只要发生这种情况就会调用该方法。通过弄乱UIView.appearance(),您可以有效地禁用层次结构中每个视图的继承链,并让每个视图都为自己的颜色而自生。在我看来,至少有两种方法可以阻止UITabBar正确表示选项卡的状态:

首先,标签栏在引擎盖下有着色的图像视图,它从父UITabBar继承了它们的色调颜色。即使他们可以从标签栏中获取特定于州的颜色,但可怜的东西也没有什么不同可以告诉他们,除了“你得到了一种颜色,你会尊重这种颜色!“接着是一记耳光和一声鞭打声,此时他们会闷闷不乐,知道的不多于以前。通过禁用分层tintColor继承系统,可以禁用状态。这不好。不要那样做。

其次,通过为每个 UIView 设置色调颜色而不管状态,您已告诉标签栏项目保持该颜色国家。这不好。不要这样做。

如果你正在使用Interface Builder(或者你喜欢的故事板),我建议在文件检查器中设置全局色调颜色,并保留它。这仍然可以按照您想要的方式设置您的色调颜色,同时将这些不良视图保存在家庭虐待中。

如果您需要查找文件检查器或全局色调选项的屏幕截图,我建议在Xcode右侧的侧边栏中查找。一点点刺痛从不伤害任何人(电影除外)。

答案 1 :(得分:0)

当你说你改变应用的色彩时,你的意思是什么?"

UIView外观代理正在执行您告诉它的操作。您要求它在您的应用中设置所有tintColor的{​​{1}},其中包括UIView内的那些观看次数。

听起来你实际上并不想改变所有UITabBar的{​​{1}},而是希望定位特定的子集。您应该查看tintColor或(现已弃用的)UIView方法。