我使用Interface创建了一个简单的视图控制器,它包含一个UIImageView和UIButton。在这两种情况下,我都把tintColor设为洋芋。

在AppDelegate上,我把UIView.appearance.tintColor设为Cyan。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIView.appearance.tintColor = UIColor.cyanColor;
return YES;
}在运行该应用程序时,我得到以下信息:

这对我来说毫无意义。我希望洋芋tintColor直接指定在imageView和按钮上覆盖青色tintColor。
为什么会发生这种情况?
作为参考,我使用Xcode版本11.2 (11B52)。
发布于 2019-11-13 21:48:08
它使tintColor属性没有使用UI_APPEARANCE_SELECTOR修饰,因此不应该在UIAppearance代理中使用它。
即使它看起来有效,设置UIView.appearance.tintColor也会产生副作用。一个例子就是故事板的这个问题。我注意到的另一种情况是,在iOS 13中,UITableView节标题将被设置的颜色填充。
考虑到这不是一个受支持的场景,很难确切说明为什么试图重写故事板上的组件的tintColor不起作用。再次检查文档后,我发现了一条可能解释它的便条:
iOS在视图进入窗口时应用外观更改,它不会更改已经在窗口中的视图的外观。若要更改当前处于窗口中的视图的外观,请从视图层次结构中移除视图,然后将其放回。
我假设在加载情节提要对象时将设置“情节提要”tintColor,然后在视图层次结构中插入视图后,UIKit将用"UIAppearance“tintColor覆盖它。
解决方案
设置全局tintColor的正确方法似乎是在主UIWindow上设置它。根据UIView.h中的注释,tintColor是由superview继承的。这允许对所有视图使用全局tintColor,并在需要时在本地重写它。在从故事板中设置属性时,它的工作方式与预期一样。
发布于 2019-11-08 09:45:32
以编程方式在tintColor类中设置ViewController。
发布于 2019-11-08 09:54:16
UIImageView也是从 UIView 继承的,改变UIView(UIImageView的父级)的外观将影响整个应用程序。如果要覆盖任何特定UI元素的外观,请创建一个IBOutlet,并通过编程将其更改为仅该UI元素。
https://stackoverflow.com/questions/58762917
复制相似问题