【问题标题】:Using UIColor(patternImage:) for UIView's tintColor?使用 UIColor(patternImage:) 作为 UIView 的 tintColor?
【发布时间】:2019-07-15 23:14:43
【问题描述】:

我正在使用UISegmentControl,并尝试为每个细分的视图提供自定义UIColor。对于纯色来说,这很容易做到。我只是这样做:

providerSegmentedControl.subviews[1].tintColor = UIColor.red

索引 1 处的段现在将被染成红色。

但是,我正在尝试为我的细分之一 UIViewtintColor 添加渐变。我的资产中有一个名为“AppleMusicGradient”的图像,如下所示:

我正在尝试使用UIColor(patternImage:) 从此图像创建UIColor。代码如下所示:

//UIImage.resize is a UIImage extension function that simply resizes a UIImage to the given CGRect
let image = UIImage(named: "AppleMusicGradient")!.resize(targetSize: providerSegmentedControl.subviews[2].frame.size)
providerSegmentedControl.subviews[2].tintColor = UIColor(patternImage: image)

但是,这种方法似乎只是部分有效。 When the given segment is selected, this gradient isn't visible at all.并且当给定的段未被选中时,渐变仅在段内的标签上可见,即通常似乎不存在边框。

请参阅“Apple Music”部分。

【问题讨论】:

  • 说大卫 - 与您的问题无关。当你需要这样的渐变时。一个非常好的事情就是............制作它,而不是使用准备好的PNG。 (有两个重要原因(1)节省大量空间(2)在每台设备上获得精确、令人敬畏、终极的分辨率。)如何:stackoverflow.com/a/47760444/294884希望它是有趣的
  • @Fattie 感谢您的推荐。我避免使用CALayer 作为渐变的原因是我不确定如何使用CALayerUISegmentedControl 子视图获得类似的效果。即我可以使用UIImage 设置tintColor,不确定我是否可以对CALayer 说同样的话。

标签: ios swift uiimage uisegmentedcontrol uicolor


【解决方案1】:

我的解决方案感觉有点“老套”,但我相信这可能就是您正在寻找的。​​p>

@IBOutlet weak var segmentedControl: UISegmentedControl!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    self.updateGradientBackground()
}

private func updateGradientBackground() {
    let sortedViews = segmentedControl.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } )
    for (index, view) in sortedViews.enumerated() {
        if index == segmentedControl.selectedSegmentIndex {
            view.backgroundColor = UIColor(patternImage: UIImage(named: "7Wk4B")!)
            view.tintColor = UIColor.clear
            let titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
            UISegmentedControl.appearance().setTitleTextAttributes(titleTextAttributes, for: .selected)
            } else {
            view.backgroundColor = UIColor.white
            view.tintColor = UIColor.blue
        }
    }
}

@IBAction func segmentedControllerTapped(_ sender: Any) {
    self.updateGradientBackground()
}

【讨论】:

  • 我在考虑每次分段更改时可能需要调用一些东西。谢谢。我会试试这个,让你知道它是如何工作的。
  • 是的,请确保您的分段控件已连接到 IBOutlet 和 IBAction。
  • 不幸的是,我无法让它工作。一方面,当设置子视图的backgroundColor 然后调用UISegmentedControl.appearance().setTitleTextAttributes() 时,各个段的文本实际上不会改变。
  • 我最后运行了这个,它似乎在选择时发生了变化。这个背景至少会变成渐变色吗?
  • 幸运的是,背景确实变成了渐变。不知道为什么我的文字没有更新颜色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多