我在使用 XCode 时遇到了一个非常具体的问题。
设置
目标中同名的颜色不同
我的 XCode 项目中有两个目标,目标 A 和 目标 B。
它们都有一个名为 Colors.xcassets 的单独资源文件夹,其颜色名为“Primary”。 目标 A 中的“主”颜色为红色,目标 B 中的“主”颜色为蓝色。
两个目标都有 Storyboard ,其中包含使用“主要”颜色的标准 UI 元素。构建并运行目标会使界面显示目标的正确“主”颜色。
共享 IBDesignable
两个目标都为自定义 UIButton
分配了相同的 IBDesignable 类,该类通过创建 UIImage
作为背景来显示颜色,以便可以圆角。
当按钮初始化或设置颜色属性时,通过调用以下函数来设置背景图像:
private func refreshBackgroundWith(color: UIColor) {
let image = createImageFrom(color: color)
setBackgroundImage(image, for: UIControl.State.normal)
clipsToBounds = true
}
图像是这样创建的:
private func createImageFrom(color: UIColor) -> UIImage {
// If color is clear, return clear image
if(color == UIColor.clear) {
return UIImage()
}
UIGraphicsBeginImageContextWithOptions(CGSize(width: 1, height: 1), true, 0.0)
color.setFill()
UIRectFill(CGRect(x: 0, y: 0, width: 1, height: 1))
let image = UIGraphicsGetImageFromCurrentImageContext()!
return image
}
这通常运行良好,但是对于上述目标颜色情况,我遇到了问题。
期望
我期望 IBDesignable 按钮根据我在 Storyboard 中分配的颜色创建背景图像,并且当我构建不同的目标时该颜色会有所不同。
结果
当我构建并运行目标 B 时,IBDesignable 按钮上的颜色显示红色,尽管我期望蓝色。反过来也可能发生这种情况,当我构建目标 A 时,它显示蓝色而不是红色。
即使目标指示它为蓝色,颜色也在 Storyboard 和指定的颜色选择器中显示红色 - 然而,这对于其他元素来说不是问题,因为一旦运行目标,就会使用正确的颜色 -除了自定义 IBDesignable 之外的所有内容。
指定颜色选择器中显示的颜色就是 IBDesignable 中显示的颜色。每当我关闭并重新启动 XCode 时,该颜色就会随机变化。
<小时/>以前有人遇到过这个确切的或类似的问题吗?我目前想知道构建过程中的哪一点没有按预期进行。
这是否是每次我构建项目运行时未完全重建项目的问题?
任何建议都将受到高度赞赏。
最佳答案
我也遇到了同样的问题。我有 2 个目标和 2 个 xcassets 文件,每个目标一个。两者都包含名为“primary”的颜色,目标 A 为蓝色,目标 B 为橙色。使用 UIColor(named: "primary")
代码按预期工作,颜色根据所选目标而变化。
切换目标不会不会用正确的颜色更新 Interface Builder 中的 Storyboard,“primary”会保留之前的值。然而,在运行时,当设置“primary”时,行为是正确的,例如 Storyboard中的背景或色调。
唯一的异常(exception)是在 Storyboard 中将“主要”分配给 IBInspectable 值时,它会将 IBInspectable 设置为在 Interface Builder 中显示的错误颜色,即使该颜色不是在所选目标的 xcassets 文件中。
我已经确认有一个<namedColor>
添加在 Storyboard XML 底部的标记,IBInspectable 似乎使用该值而不是运行时值。当使用目标之间共享的命名颜色时,IBInspectables 没有问题。
Xcode 版本:10.3 部署目标:iOS 11.0
关于ios - IBDesignable 的自定义背景颜色属性不会根据目标进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56150496/