无法以编程方式将情节提要中设置的颜色更改为xcassets目录中的颜色

时间:2018-12-02 19:03:54

标签: swift xcode colors uicolor xcasset

当我在情节提要中设置某些属性的颜色(例如我的textColor的{​​{1}})作为在xcassets目录中创建为“新颜色集”的颜色时

enter image description here

然后我无法以编程方式更改此颜色:

UILabel

...请注意,我是从数据源方法label.textColor = UIColor(named: "HighlightedGreen") 调用它的。

黑客: 我可以通过在情节提要中将此颜色设置为从颜色选择器中拾取的任何其他颜色来解决此问题,但我想知道为什么会发生这种情况。

那么,为什么会这样?

2 个答案:

答案 0 :(得分:5)

UIView加载subClass之类的UITableViewCell Storyboard/Xib时,会将Attribute Inspector中指定的属性应用于所有subViews 。我们有以下回调方法来了解何时从Storyboard/Xib加载视图,

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()        
}

override func awakeFromNib() {
    super.awakeFromNib()
}

这些方法可能是添加/删除subView的不错选择,但不应更新subView的size或某些attribute inspector相关属性。推荐的更新subViews的方法是当超级视图完成加载和应用所有attribute inspector属性并调用layoutSubviews时。因此,您应该将所有外观更改都应用于subView。例如,

override func layoutSubviews() {
    super.layoutSubviews()

    label.textColor = UIColor(named: "HighlightedGreen")
}

对于UITableViewCell,实现UITableViewDataSource的任何对象还可以保证delegate方法在显示如下单元格之前应用任何外观更改,因此这也是另一个很好的候选对象更改颜色。

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    (cell as! MyListTableViewCell).label.textColor = UIColor(named: "HighlightedGreen")
}

答案 1 :(得分:1)

真正的答案是,这更接近于错误。在iOS 13中,以编程方式将IB中的颜色资产设置为任何其他颜色都没有问题。

我从iOS 12调试会话中获取了一些日志,在其中尝试了OP的操作:

  

单元格1

     
    

在awakeFromNib 处:UIExtendedSRGBColorSpace 0.235 0.235 0.263 0.6
    将背景颜色设置为:UIExtendedSRGBColorSpace 0.235 0.235 0.263 0.6
    在layoutSubviews处:kCGColorSpaceModelRGB 0.235 0.235 0.263 0.6

  
     

单元2

     
    

在awakeFromNib 处:UIExtendedSRGBColorSpace 0.235 0.235 0.263 0.6
    将背景色设置为:kCGColorSpaceModelRGB 0.490196 0.760784 0.262745 1
    在layoutSubviews处:kCGColorSpaceModelRGB 0.235 0.235 0.263 0.6

  

在iOS 13中,日志(和结果)不同:

  

单元格1

     
    

在awakeFromNib :UIDynamicCatalogColor:0x600003e83600;名称=我的背景色
    将背景颜色设置为:UIExtendedSRGBColorSpace 0.235 0.235 0.263 0.6
    在layoutSubviews处:UIExtendedSRGBColorSpace 0.235 0.235 0.263 0.6

  
     

单元格2

     
    

在awakeFromNib 处:UIDynamicCatalogColor:0x600003e99290;名称=我的背景色
    将背景颜色设置为:UIDynamicCatalogColor:0x600003e99020;名称=按钮绿色
    在layoutSubviews处:UIDynamicCatalogColor:0x600003e99350;名称=按钮绿色

  

layoutSubviews()期间,iOS 12将命名的颜色转换为它使用的颜色空间时似乎存在时间问题,因此在此之前尝试覆盖颜色是徒劳的。但是,iOS 13似乎在没有翻译的情况下本机使用UIDynamicCatalogColor,因此没有计时问题。

对于Xcode来说,颜色资产似乎有点事后才想到。在将它们在您的整个应用程序中使用后重命名它们,或者将它们与#colorLiteral一起使用,或者将它们更改为不同的特征集,祝您好运。不幸的是,目前最好的解决方案似乎是根本不在IB中使用它们。