如果我执行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
中的那些视图。
听起来你并不想改变所有UIView
的tintColor
,而是想要针对一个特定的子集。您应该查看appearanceForTraitCollection
或(现在已弃用)appearanceWhenContainedIn
方法。