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

标签 ios swift xcode uicolor ibdesignable

我在使用 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/

相关文章:

arrays - 无法快速将对象追加到对象数组中

ios - 在崩溃管理器和 Xcode 7 中强制使用崩溃符号

ios - NSMutableArray 删除对象正在克隆数组中的另一个对象

XCode 页面 View Controller : make dots transparent

javascript - 移动 safari 与主屏幕 webapp

ios - CAPS 页面菜单 : willMoveToPage delegate method getting error

iOS - 下载动态字体

ios - 在 SKScene 的子节点上运行一个简单的操作会导致 iOS 7.1 中的 EXC_BAD_ACCESS

ios - 将谷歌分析跟踪添加到我的 iOS Today 小部件

swift - 错误域=NSCocoaErrorDomain 代码=256