【问题标题】:UIAppearance tintColor takes priority over Storyboard tintColorUIAppearance tintColor 优先于 Storyboard tintColor
【发布时间】:2020-03-04 20:54:45
【问题描述】:

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

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

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

    UIView.appearance.tintColor = UIColor.cyanColor;

    return YES;
}

运行应用程序时,我得到以下信息:

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

为什么会这样?

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

【问题讨论】:

    标签: ios storyboard uiappearance


    【解决方案1】:

    原来tintColor 属性没有用UI_APPEARANCE_SELECTOR 装饰,所以它不应该在 UIAppearance 代理中使用。

    即使看起来有效,设置UIView.appearance.tintColor 也有副作用。一个例子是故事板的这个问题。我注意到的另一种情况是,在 iOS 13 中,UITableView 部分标题将被设置的颜色填充。

    鉴于它不是受支持的场景,很难确切说明为什么尝试覆盖情节提要上的组件的 tintColor 不起作用。再次检查文档,我发现了一个可以解释它的注释:

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

    我假设在加载故事板对象时会设置“故事板”tintColor,然后一旦视图插入到视图层次结构中,UIKit 就会用“UIAppearance”色调覆盖它。

    解决方案

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我不确定 UIView 子类是否会继承它的外观,文档对此并不清楚。无论如何,在情节提要中的特定实例上设置 tintColor 应该与这样做完全相同通过代码。这是我的问题:为什么不是?
      • @Zmaster 是的,当 UIImageview 从 UIView 继承时,它也会继承它的外观。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 2011-08-15
        • 1970-01-01
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多