You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过UIColor实现柔化及相近差异化色彩效果?

嘿,这个问题我刚好之前做UI优化的时候研究过!要实现这种和原色调相近但更柔和的色彩效果,其实核心是对颜色的饱和度、亮度或者进行色彩混合来调整,用UIColor完全可以搞定,我给你分享几个实用的方法:

方法1:降低饱和度+微调亮度(最常用的柔化思路)

颜色太刺眼大多是因为饱和度太高,降低饱和度能让颜色变得温和,再稍微提高一点亮度,就能得到那种柔而不淡的效果。我们可以利用UIColor的HSB(色相-饱和度-亮度)模型来调整,因为色相不变的话,色调就会和原颜色保持一致。

给UIColor写个扩展方法就很方便复用:

extension UIColor {
    func softedColor(withSaturationFactor saturationFactor: CGFloat = 0.6, brightnessFactor: CGFloat = 0.9) -> UIColor {
        var hue: CGFloat = 0
        var saturation: CGFloat = 0
        var brightness: CGFloat = 0
        var alpha: CGFloat = 0
        
        // 把当前颜色转成HSB空间
        guard self.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) else {
            return self // 如果转换失败,返回原颜色
        }
        
        // 调整饱和度和亮度,这里的系数可以根据需求调整
        let newSaturation = saturation * saturationFactor
        let newBrightness = min(brightness * brightnessFactor, 1.0) // 不要超过1.0,避免过曝
        
        return UIColor(hue: hue, saturation: newSaturation, brightness: newBrightness, alpha: alpha)
    }
}

举个例子:原颜色是UIColor.systemBlue,调用systemBlue.softedColor()就能得到一个柔和的天蓝色,和原色调完全统一,但质感更温润。

方法2:混合白色生成淡柔色调

如果想要更浅的柔化效果,直接把原颜色和白色按比例混合就行,适合做卡片背景、次要按钮这类需要低存在感的元素。

同样写个扩展方法:

extension UIColor {
    func mixedWithWhite(ratio: CGFloat = 0.3) -> UIColor {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        
        guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else {
            return self
        }
        
        // 按比例混合白色(RGB都是1.0)
        let newRed = red * (1 - ratio) + 1.0 * ratio
        let newGreen = green * (1 - ratio) + 1.0 * ratio
        let newBlue = blue * (1 - ratio) + 1.0 * ratio
        
        return UIColor(red: newRed, green: newGreen, blue: newBlue, alpha: alpha)
    }
}

比如UIColor.systemPink.mixedWithWhite(ratio: 0.4),就能得到一个柔和的淡粉色,完全保留原色调的感觉,但不会太艳丽。

方法3:混合中性灰生成沉稳柔化色

如果不想颜色太浅,而是想要一种低对比度的沉稳柔化效果,可以混合中性灰色(比如RGB(0.5,0.5,0.5)),这种方式适合做深色模式下的柔化处理。

扩展方法类似:

extension UIColor {
    func mixedWithNeutralGray(ratio: CGFloat = 0.2) -> UIColor {
        let grayRed: CGFloat = 0.5
        let grayGreen: CGFloat = 0.5
        let grayBlue: CGFloat = 0.5
        
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        var alpha: CGFloat = 0
        
        guard self.getRed(&red, green: &green, blue: &blue, alpha: &alpha) else {
            return self
        }
        
        let newRed = red * (1 - ratio) + grayRed * ratio
        let newGreen = green * (1 - ratio) + grayGreen * ratio
        let newBlue = blue * (1 - ratio) + grayBlue * ratio
        
        return UIColor(red: newRed, green: newGreen, blue: newBlue, alpha: alpha)
    }
}
额外提示:适配动态颜色(iOS 13+)

如果你的App需要支持明暗模式,别忘了把柔化后的颜色也做成动态的,比如:

let softDynamicBlue = UIColor { traitCollection in
    let baseColor = traitCollection.userInterfaceStyle == .dark ? UIColor.systemBlue : UIColor.systemBlue
    return baseColor.softedColor()
}

这样在明暗模式下,柔化色都会和当前模式的基础色匹配。

内容的提问来源于stack exchange,提问作者Simon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:45:52