我使用Interface Builder创建了一个简单的视图控制器,其中包含UIImageView和UIButton。我都将tintColor
设置为洋红色。
在AppDelegate上,我将UIView.appearance.tintColor
设置为Cyan。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIView.appearance.tintColor = UIColor.cyanColor;
return YES;
}
运行该应用程序时,我得到以下提示:
这对我来说没有意义。我希望直接在imageView和按钮上指定的洋红色tintColor会覆盖青色的tintColor。
为什么会这样?
作为参考,我使用的是Xcode版本11.2(11B52)。
答案 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,并在需要时在本地覆盖它。通过情节提要设置属性时,它可以按预期工作。