2017-11-18 190 views
1

我在Swift制作了一个颜色选择器应用程序,我需要文本来适应背景颜色。在Swift中确定背景颜色的文本颜色?

我在默认情况下是黑色的UIView上有文字,如果有较深的背景颜色,我希望它变浅,如果有较浅的背景颜色使文字更暗,以使文字更具可读性。

下面是一些截图:

几乎没有可读的文本(第1图像)
img

几乎没有可读的文本(2图像)
img

如果可能的话我会很感激你的回复。

回答

2

你可以这样做:

extension UIColor 
{ 
    var isDarkColor: Bool { 
     var r, g, b, a: CGFloat 
     (r, g, b, a) = (0, 0, 0, 0) 
     self.getRed(&r, green: &g, blue: &b, alpha: &a) 
     let lum = 0.2126 * r + 0.7152 * g + 0.0722 * b 
     return lum < 0.50 ? true : false 
    } 
} 

这将计算颜色的亮度,并确定它是否超过某一阈值。然后说myLabel.textColor = view.backgroundColor?.isDarkColor == true ? .white : .black

+0

这工作得很好! –

0

可以实现黑色和白色取决于任何颜色的亮度。

在这里,一些可以理解的解决方案。

扩展:

extension UIColor{ 

    var brightnessAdjustedColor:UIColor{ 

     var components = self.cgColor.components 
     let alpha = components?.last 
     components?.removeLast() 
     let color = CGFloat(1-(components?.max())! >= 0.5 ? 1.0 : 0.0) 
     return UIColor(red: color, green: color, blue: color, alpha: alpha!) 
    } 
} 

在上述extension亮度通过对RGB颜色分量中的最高值确定。 color会给逐步调整,而不必0.5 ? 1.0 : 0.0这condition.i.e,let color = CGFloat(1-(components?.max())!

ViewController

@IBOutlet var labelBrightness: UILabel! 

var red:CGFloat = 0.0 
var blue:CGFloat = 0.0 
var green:CGFloat = 0.0 

@IBAction func actionSlider(_ sender: UISlider) { 

    if sender.tag == 1{ 
     red = CGFloat(sender.value/255) 
    }else if sender.tag == 2{ 
     green = CGFloat(sender.value/255) 
    }else{ 
     blue = CGFloat(sender.value/255) 
    } 

    let backgroundColor = UIColor(red: self.red, green: self.green, blue: self.blue, alpha: 1.0) 

    self.view.backgroundColor = backgroundColor 
    self.labelBrightness.textColor = backgroundColor.brightnessAdjustedColor 
} 

输出:

enter image description here