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



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

我不明白为什么会这样。我只是改变了应用程序的色调,默认情况下,色调不会使所有标签栏图标同时看起来活跃。

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

我希望你现在已经找到了解决方案,但这是我的两点意见。

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

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

还需要注意的是,您可以通过覆盖tintColorChanged()方法在UIViewController中响应此问题,该方法在发生此情况时被调用。通过修改UIView.appearance(),您可以有效地禁用层次结构中每个视图的继承链,并让每个视图为自己的颜色寻找自己的颜色。在我看来,至少有两种方式可能会阻止UITabBar正确地表示选项卡的状态:

首先,标签栏下面有着色的图像视图,它们从父UITabBar继承了它们的着色颜色。即使他们可以从标签栏中获得特定于州的颜色,可怜的东西也没有什么不同的东西可以告诉他们,除了"你被赋予了一种颜色,你会尊重这种颜色!"",然后是一巴掌和一声鞭笞,这时他们会生气地回应,和以前一样,什么也不知道。通过禁用分级tintColor继承系统,可以禁用state。这可不太好。别那样做。

其次,通过设置每个 UIView 的颜色,无论状态如何,您已经告诉选项卡栏项保持该颜色,无论状态如何。这可不太好。也不要那样做。

如果你正在使用Interface Builder(或者Storyboards,如果你喜欢的话),我建议你在文件检查器中设置全局色调,并保留它。这仍然可以按照你想要的方式设置你的色调,同时避免这些糟糕的视图被家庭虐待。

如果你需要在哪里找到文件检查器或全局色调选项的截图,我建议在Xcode的右侧侧边栏上戳一戳。小打小闹不会伤害任何人(除了在电影里)。

当你说你在"改变应用程序的色调"是什么意思?

UIView外观代理正在做您告诉它的事情。您要求它在您的应用程序中设置所有UIView s的tintColor,其中包括您的UITabBar中的那些视图。

听起来你并不想改变所有UIViewtintColor,而是想要针对一个特定的子集。您应该查看appearanceForTraitCollection或(现在已弃用)appearanceWhenContainedIn方法。

最新更新