【问题标题】:Comparing Two UIColor DynamicProvider (iOS13) Returns False比较两个 UIColor DynamicProvider (iOS13) 返回 False
【发布时间】:2019-12-15 23:51:18
【问题描述】:

Xcode 11 / iOS 13

当我使用UIColor(dynamicProvider:) 初始化 2 个 UIColor 对象时,我不能再使用color1 == color2,因为(我认为)它无法比较闭包。

当您在属性中使用颜色时,此问题还会破坏 NSAttributedStrings 的比较。

示例

extension UIColor {

    // MARK: - Specify All Colors

    convenience init(light: UIColor, dark: UIColor) {

        self.init(dynamicProvider: { (traits) in
            switch traits.userInterfaceStyle {
            case .unspecified, .light: return light
            case .dark: return dark
            }
        })
    }
}

UIColor(light: .white, dark: .white) == UIColor(light: .white, dark: .white) // false

当前(非最佳解决方案)

func equals(_ object: Any?) -> Bool {
    guard let rhs = object as? UIColor else { return false }

    var lhsR: CGFloat = 0
    var lhsG: CGFloat = 0
    var lhsB: CGFloat = 0
    var lhsA: CGFloat = 0
    getRed(&lhsR, green: &lhsG, blue: &lhsB, alpha: &lhsA)

    var rhsR: CGFloat = 0
    var rhsG: CGFloat = 0
    var rhsB: CGFloat = 0
    var rhsA: CGFloat = 0
    rhs.getRed(&rhsR, green: &rhsG, blue: &rhsB, alpha: &rhsA)

    return  lhsR == rhsR && lhsG == rhsG && lhsB == rhsB && lhsA == rhsA
}

有了这个,你就不能再使用==,但是当你想比较颜色时必须显式调用这个函数。

但更好的解决方案是使用resolvedColor(with:) 比较颜色的每种表示。但这必须由 Apple 实现,这样我们才能继续使用 ==Equatable 协议。

【问题讨论】:

  • 添加你目前尝试过的代码,
  • 完成 - 感谢提示。
  • 比较来自 xcassets 的动态颜色按预期工作,但我不知道你是否可以使用它。
  • 替代方案是stackoverflow.com/a/58398769/1071510,但不适用于NSAttributedString
  • @Grubas 显然不是,因为我们有很多重复使用现有颜色(如文本颜色)的白标应用程序,因此我们必须在代码中创建它们。

标签: swift uicolor xcode11 ios13 ios-darkmode


【解决方案1】:

尝试使用=== 而不是==

UIColor(light: .white, dark: .white) === UIColor(light: .white, dark: .white)

【讨论】:

  • 这对我不起作用,因为我(和 NSAttributedString)需要组件式相等(==)而不是指针式(===)。示例UIColor(red: 0, green: 0, blue: 0, alpha: 0) === UIColor(red: 0, green: 0, blue: 0, alpha: 0) 例如已经返回 false,这意味着在这种情况下使用动态提供程序也将不起作用。
猜你喜欢
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多