根据动态变化的背景动态更改标签/按钮文本颜色



我知道问这个问题听起来有些拖累,但是我很好奇是否可以使用。

我正在构建一个应用程序,其中每个视图控制器的背景图像(覆盖具有模糊效果的完整视图(动态变化。此背景图像将在所有视图控制器中,每个图像都具有不同的UIControls(标签,按钮,表观视图,收集视图,容器,选项卡等(。

有时,当背景图像非常轻时,带有白色文本颜色的前景文本(标签,按钮(根本不可见。反之亦然也是一个问题。

所以我想知道是否有任何方法可以根据其背景动态更改前景文本颜色。

最近我遇到了同样的问题,我认为您要寻找的是图像是明亮的或黑暗的,因此您可以相应地设置属性,希望这会有所帮助。

创建观察者,每次都会更改图像,它将检查其暗图像还是明亮的图像,并根据该功能称为uifordarkimage和uiforbrightimage

//图像视图观察者观察图像更改并根据图像颜色执行UI操作

//Your imageView you are using to set image
var imageView: UIImageView {
    didSet {
       if imageView.isDark(image.bounds) { //dont pass the full image bounds pass the rect where your buttons or label places it will save your hell lot of time
          setUIForDarkImage() // here you set buttons and labels color to white or whatever changes you want to perform based dark image
       } 
       else {
         setUIForBrightImage() // here you set buttons and labels color to black or whatever changes you want to perform based bright image
       }
    }
}

uiimageViewExtension用于检查图像是暗图像还是明亮的图像。

发生的是,它将通过像素图像像素,并检查像素是明亮还是黑暗,如果我们比我们设定的阈值更黑暗的像素,我们会假设它是一个深色的图像明亮的图像。

ps:为了提高效率,不要检查整个图像(对于高分辨率图像,如果我们会检查所有像素,它将减慢速度(,因此仅检查我们需要按钮或标签的图像的一部分,您可以根据您的要求设置RECT。并缩放0.45,以检查该矩形中的几个像素(您可以增加或减少以获得更多/更低的精度(。

extension UIImageView {
    func isDark(_ rect:CGRect)->Bool {
       let s=image?.cgImage?.cropping(to: rect);
       let data=s?.dataProvider?.data;
       if data == nil {return false;}
       guard let ptr = CFDataGetBytePtr(data) else {return false;}
       let threshold = Int(Double(rect.width * rect.height) * 0.45);
       var dark = 0,len=CFDataGetLength(data);
       for i in stride(from: 0, to: len, by: 4) {
           let r = ptr[i], g = ptr[i+1], b = ptr[i+2];
           if (0.299 * Double(r) + 0.587 * Double(g) + 0.114 * Double(b)) < 100 {dark += 1;}
          if dark > threshold {return true;}
       }
    return false;
  }
}

ps:如果您也想知道我在setuiforBrightimage((和setuifordarkimage中所做的事情,请让我知道

这是我要做的:创建一个包含图像视图的名称和用于标签,按钮等的颜色的结构。

使用此新结构将视图控制器添加属性。我们称其为 backgroundImageSettings

didSet方法添加到调用另一种方法useBackgroundImageSettings()的属性中,该方法将图像安装到视图控制器的内容视图的背景中,为视图控制器的内容视图设置色调颜色,并在内容视图上调用setNeedsDisplay()。在您的ViewDidload中调用useBackgroundImageSettings(),以便设置backgroundImageSettings即使您查看控制器的视图尚未加载。

我喜欢邓肯的答案!您可以采取的另一个步骤是将略微覆盖层置于您的背景图像上。

例如,如果您的背景图像非常深色,并且看不到黑色文字,那么您可以添加带有白色背景颜色和不透明度的层小于1。有些白色以使您的文本更可读,您仍然可以看到背景图像。

let overlay = UIView(frame: yourSuperView.bounds)
overlay.backgroundColor = UIColor.white
overlay.layer.opacity = 0.5
yourSuperView.addSubview(overlay)

最新更新