使用UIColor(patternImage :)的UIView的tintColor吗?

时间:2019-07-15 14:40:39

标签: ios swift uiimage uisegmentedcontrol uicolor

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

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

现在索引1的句段将变成红色。

但是,我正在尝试为细分受众群tintColor之一的UIView添加渐变。我的资产中有一个名为“ AppleMusicGradient”的图像,看起来像这样: enter image description here

我正在尝试使用UIColor从该图像创建一个UIColor(patternImage:)。代码如下:

//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)

但是,此方法似乎只能部分起作用。选择给定的线段时,此渐变完全不可见。而且,当未选择给定的线段时,渐变仅在线段内部的标签上可见,即通常似乎没有边框。

enter image description here

请参阅“ Apple Music”部分。

1 个答案:

答案 0 :(得分:0)

我的解决方案有点“ hacky”,但我相信这可能正是您想要的。

@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()
}