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

时间:2018-03-30 11:55:09

标签: swift user-experience textcolor

我知道提出这个问题可能听起来有点拖累但我很好奇是否有这样的问题。

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

向调用另一个方法didSet的属性添加useBackgroundImageSettings()方法,该方法将图像安装到视图控制器的内容视图的背景中,设置视图控制器的色调颜色&# 39;内容视图,并在内容视图中调用setNeedsDisplay()。同时在viewDidLoad中调用useBackgroundImageSettings(),以便即使您查看控制器的视图,设置backgroundImageSettings仍然有效还没有加载。

答案 1 :(得分:0)

我喜欢邓肯的回答!您可以采取的另一个步骤是在背景图像上设置一个轻微的叠加层。

例如,如果您的背景图像颜色非常深,并且您无法很好地看到黑色文本,则可以添加背景颜色为白色且不透明度小于1的图层。这样就可以了一点白色使你的文字更具可读性,你仍然可以看到背景图片。

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

答案 2 :(得分:0)

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

创建观察者,每次图像更改时都会检查它是暗图像还是亮图像并且会调用函数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用于检查图像是暗图像还是明亮图像。

发生了什么,它将逐个像素地检查图像并检查像素是亮还是暗,如果我们得到的暗像素大于我们设置的阈值,我们将假设它是一个黑暗的图像,否则它& #39;明亮的形象。

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