2017-11-18 154 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