IBDesignable的自定义背景色属性不会根据目标进行更新

时间:2019-05-15 13:24:13

标签: ios swift xcode uicolor ibdesignable

我遇到了XCode的一个非常具体的问题。

设置

目标中同名的颜色

我的XCode项目中有两个目标,目标A 目标B

它们都有一个名为Colors.xcassets的单独资产文件夹,其颜色为“主要” 目标A中的颜色”主要”为红色目标B中的颜色为蓝色

两个目标都有带有标准UI元素的情节提要,颜色为“主要”。生成并运行目标会使界面显示目标的正确“主”颜色。

共享的IBDesignable

两个目标都为自定义UIButton分配了相同的 IBDesignable 类,该自定义UIImage通过创建private func refreshBackgroundWith(color: UIColor) { let image = createImageFrom(color: color) setBackgroundImage(image, for: UIControl.State.normal) clipsToBounds = true } 作为背景来显示颜色,从而可以对其进行四舍五入。

初始化按钮或设置color属性时,通过调用以下函数来设置背景图像:

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
}

图像创建如下:

REG ADD HKCU\CONSOLE /f /v VirtualTerminalLevel /t REG_DWORD /d 1

总体来说效果很好,但是在上述目标颜色的情况下,我遇到了问题。

期望

我希望IBDesignable按钮可以根据我在情节提要中分配的颜色创建背景图像,并且当我构建不同的目标时,该颜色会有所不同。

结果

当我构建并运行目标B时,即使我期望是蓝色,IBDesignable按钮上的颜色也会显示为红色。当我构建目标A并显示蓝色而不是红色时,也可能发生这种情况。

即使目标将颜色指示为蓝色,该颜色也会在情节提要和命名的拾色器中显示为红色-但是,这对于其他元素来说不是问题,因为一旦目标运行后,就会使用正确的颜色-除自定义IBDesignable外,所有内容均适用。

在命名的颜色选择器中显示的颜色是在IBDesignable中显示的颜色。每当我关闭并重新启动XCode时,颜色就会随机变化。


以前有人遇到过这个确切或类似的问题吗?我目前想知道构建过程中的哪个阶段没有按预期进行。

这是否是每次生成运行项目时都无法完全重建项目的问题?

任何建议都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

我有同样的问题。我有2个目标和2个xcassets文件,每个目标一个。两者都包含一种名为“主色”的颜色,对于目标A是蓝色,对于目标B是橙色。在代码中使用UIColor(named: "primary")可以按预期工作,颜色会根据所选目标而变化。

切换目标并不会不会用正确的颜色更新Interface Builder中的情节提要,“ primary”保留其先前的值。但是,在运行时,将“ primary”设置为例如情节提要中的背景色或淡色。

唯一的例外是在情节提要中为IBInspectable值分配“主要” 时,然后将IBInspectable设置为在Interface Builder中显示的错误颜色,即使该颜色不是在选定目标的xcassets文件中。

我已经确认在情节提要的XML的底部添加了一个<namedColor>标记,IBInspectable似乎正在使用该值而不是运行时值。使用目标之间共享的命名颜色时,IBInspectables没有问题。

Xcode版本:10.3 部署目标:iOS 11.0