Rob*_*ler 4 xcode colors uicolor xcasset swift
当我在情节提要中将某些属性的颜色(例如textColormy UILabel)设置为在xcassets目录中作为“新建颜色集”创建的颜色时
那么我无法在第一次尝试时以编程方式更改此颜色:
label.textColor = UIColor(named: "HighlightedGreen")
Run Code Online (Sandbox Code Playgroud)
...请注意,我是从数据源方法调用它的cellForItemAt。
哈克: 我可以通过在情节提要中将此颜色设置为从颜色选择器中拾取的任何其他颜色来解决该问题,但是我想知道为什么会这样。
那么,为什么会这样呢?
当一个UIView subClass像UITableViewCell从装载Storyboard/Xib,它适用于特定属性Attribute Inspector的所有subViews。我们提供了以下回调方法来了解何时从中加载视图Storyboard/Xib,
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
}
override func awakeFromNib() {
super.awakeFromNib()
}
Run Code Online (Sandbox Code Playgroud)
这些方法可能是添加/删除subView的不错的选择,但不应将其更新为subView size或某些attribute inspector相关属性。推荐的更新subViews的方法是当超级视图完成加载并应用所有attribute inspector属性和调用之后layoutSubviews。因此,您应该将所有外观更改都应用于subView。例如,
override func layoutSubviews() {
super.layoutSubviews()
label.textColor = UIColor(named: "HighlightedGreen")
}
Run Code Online (Sandbox Code Playgroud)
对于UITableViewCell,任何实现的对象UITableViewDataSource还可以保证一种delegate方法,可以在显示如下单元格之前应用任何外观更改,因此,这也是更改颜色的另一个不错的选择。
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
(cell as! MyListTableViewCell).label.textColor = UIColor(named: "HighlightedGreen")
}
Run Code Online (Sandbox Code Playgroud)
真正的答案是这更接近于一个错误。在 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 处: kCGColorSpaceModel RGB 0.235 0.2633单元格 2
在awakeFromNib 处:UIExtendedSRGBColorSpace 0.235 0.235 0.263 0.6
将背景颜色设置为:kCGColorSpaceModelRGB 0.490196 0.760784 0.262745 1
在 layoutSubviews 处:kCGColorSpaceModelRGB 0.26350.26350.26350
在 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; name = Button Green
At layoutSubviews : UIDynamicCatalogColor: 0x600003e99350; 名称 = 按钮绿色
当 iOS 12 将命名颜色转换为它使用的颜色空间时,似乎存在时间问题,因此在layoutSubviews()此之前尝试覆盖颜色是徒劳的。但是,iOS 13 似乎在没有翻译的情况下原生使用 UIDynamicCatalogColor,因此不存在计时问题。
颜色资产对于 Xcode 整体来说似乎有点事后诸葛亮。祝你在整个应用程序中使用它们后重命名它们,将它们与 #colorLiteral 一起使用,或者为不同的特征集合更改它们。不幸的是,目前最好的解决方案似乎是根本不在 IB 中使用它们。
| 归档时间: |
|
| 查看次数: |
534 次 |
| 最近记录: |