繁体   English   中英

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

[英]Changing Label/Button Text colour dynamically based on the dynamically changing background

我知道提出这个问题可能听起来有些拖延,但我很好奇是否有类似的方法。

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

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

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

我将执行以下操作:创建一个结构,该结构包含图像视图的名称以及用于标签,按钮等的淡色。

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

didSet属性添加一个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)

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

创建观察者时,每次图像更改时,它都会检查其图像是暗还是亮,并基于此调用函数UIForDarkImage和UIForBrightImage

// ImageView观察器可观察图像变化并根据图像颜色执行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用于检查Image是深色图像还是明亮图像。

发生的是,它将逐个像素地检查图像,并检查该像素是亮还是暗,如果暗像素超过设置的阈值,我们将假定其为暗图像,否则为亮图像。 。

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中正在做什么,请告诉我

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM