ios 无法理解为什么开关大小写不匹配,systemBrown UIColor

3duebb1j  于 2022-12-01  发布在  iOS
关注(0)|答案(2)|浏览(142)

我有一个接受UIColor的函数。

func getColor(_ background: UIColor) -> UIColor {
    switch background {
    case .white, .systemBrown:
        return .black
    case .darkGray:
        return .lightGray
    case .black:
        return .white
    default:
        return .label
    }
}

我有一个带背景颜色UIButton

let brownButton: UIButton = {
    let btn = UIButton()
    btn.translatesAutoresizingMaskIntoConstraints = false
    btn.backgroundColor = .systemBrown
    btn.layer.borderWidth = 1.0
    btn.layer.borderColor = UIColor.brown.cgColor
    return btn
}()

当我这样调用函数时:

getColor(brownButton.backgroundColor!)

它返回.label(默认情况下)。但当我使用:

getColor(.systemBrown)

我得到了预期的结果

ppcbkaq5

ppcbkaq51#

“系统”颜色是动态的,取决于它们所应用到的特征集合。
打印各种颜色可让您了解不同之处:

let color = view.backgroundColor!
print("Background: \(color)")
print("SystemBrown: \(UIColor.systemBrown)")

输出为:
背景:〈UID动态修改颜色:0x 60000394 d 6 e0的最大值;对比度=正常,基色=〈UID动态目录系统颜色:0x 600002277000的整数倍;名称=系统棕色颜色〉〉
系统棕色:动态目录系统颜色:0x 600002277000的整数倍;名称=系统棕色颜色〉
这表示将systemBrown颜色应用于视图时,颜色的属性发生了一些变化。这意味着它不再等同于“普通”的systemBrown颜色。
一种解决方案是将所有相关的颜色解析为适当的特征集合。
通过解析case语句中使用的任何动态颜色来更新getColors

func getColor(_ background: UIColor, traits: UITraitCollection) -> UIColor {
    switch background {
    case .white, .systemBrown.resolvedColor(with: traits):
        return .black
    case .darkGray:
        return .lightGray
    case .black:
        return .white
    default:
        return .label
    }
}

然后将您的呼叫更新为getColors

getColor(color.resolvedColor(with: view.traitCollection), traits: view.traitCollection)

您需要解析传递的背景颜色,并将视图的traitCollection传递给getColors
如果您总是使用视图的backgroundColor,则可以将getColors更改为只使用UIView参数,并根据需要解析该函数中的颜色。

qnakjoqk

qnakjoqk2#

这可能是因为系统正在对背景颜色进行某些操作,如对背景颜色应用色调。
我建议记录UIColor.systemBrown和brownButton的backgroundColor的RGB和alpha值。您可能会发现它们略有不同。在这种情况下,您可能需要编写一个"颜色接近另一种颜色"的比较。(假设R、G和B分量彼此之间的差值在0.02以内,或者0 - 255之间的整数值在5以内。我只是凭空得出了这些范围,但它们可能是一个很好的起点。)
大概是这样的:

extension UIColor {
    func isSimilarToColor(_ otherColor: UIColor) -> Bool {
        var myRed: CGFloat = 0
        var myGreen: CGFloat = 0
        var myBlue: CGFloat = 0
        var myAlpha: CGFloat = 0

        var otherRed: CGFloat = 0
        var otherGreen: CGFloat = 0
        var otherBlue: CGFloat = 0
        var otherAlpha: CGFloat = 0

        self.getRed(&myRed, green: &myGreen, blue: &myBlue, alpha: &myAlpha)
        otherColor.getRed(&otherRed, green: &otherGreen, blue: &otherBlue, alpha: &otherAlpha)
        let slop: CGFloat = 0.02
        return
            myAlpha == 1.0 && otherAlpha == 1.0 &&
            abs(myRed-otherRed) < slop &&
            abs(myGreen-otherGreen) < slop  &&
            abs(myBlue-otherBlue) < slop
    }
}

相关问题