UIAppearance tintColor优先于Storyboard tintColor

时间:2019-11-08 08:26:33

标签: ios storyboard uiappearance

我使用Interface Builder创建了一个简单的视图控制器,其中包含UIImageView和UIButton。我都将tintColor设置为洋红色。

Interface Builder

在AppDelegate上,我将UIView.appearance.tintColor设置为Cyan。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    UIView.appearance.tintColor = UIColor.cyanColor;

    return YES;
}

运行该应用程序时,我得到以下提示:

Simulator

这对我来说没有意义。我希望直接在imageView和按钮上指定的洋红色tintColor会覆盖青色的tintColor。

为什么会这样?

作为参考,我使用的是Xcode版本11.2(11B52)。

3 个答案:

答案 0 :(得分:0)

以编程方式在ViewController类中设置tintColor。

答案 1 :(得分:0)

UIImageView 也是从 UIView 继承的,更改UIView(UIImageView的父级)的外观将影响整个应用程序。如果要覆盖任何特定UI元素的外观,请创建一个 IBOutlet ,并以编程方式将其更改为仅该UI元素。

答案 2 :(得分:0)

这将使tintColor属性没有用UI_APPEARANCE_SELECTOR装饰,因此不应在UIAppearance代理中使用它。

即使似乎可行,设置UIView.appearance.tintColor也有副作用。情节提要的问题就是一个例子。我注意到的另一种情况是,在iOS 13中,UITableView节标题将变为设置的颜色。

鉴于这不是受支持的方案,因此很难确切说明为什么尝试为情节提要中的某个组件覆盖tintColor无效的原因。再次检查文档,我发现了一条说明,但可能会对其进行解释:

  

iOS在视图进入窗口时应用外观更改,它不会更改窗口中已有视图的外观。要更改当前在窗口中的视图的外观,请从视图层次结构中删除该视图,然后将其放回原处。

我假设在加载情节提要对象时将设置“ storyboard” tintColor,然后将视图插入视图层次结构后,UIKit将使用“ UIAppearance” tintColor覆盖它。

解决方案

设置全局tintColor的正确方法似乎是在主UIWindow上进行设置。根据UIView.h中的注释,tintColor由超级视图继承。这允许对所有视图使用全局tintColor,并在需要时在本地覆盖它。通过情节提要设置属性时,它可以按预期工作。