gpt4 book ai didi

ios - 分段控件中的渐变色

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:43 25 4
gpt4 key购买 nike

我用这个方法得到渐变图像

func gradient(size:CGSize,color:[UIColor]) -> UIImage?{
//turn color into cgcolor
let colors = color.map{$0.cgColor}
//begin graphics context
UIGraphicsBeginImageContextWithOptions(size, true, 0.0)
guard let context = UIGraphicsGetCurrentContext() else {
return nil
}
// From now on, the context gets ended if any return happens
defer {UIGraphicsEndImageContext()}
//create core graphics context
let locations:[CGFloat] = [0.0,1.0]
guard let gredient = CGGradient.init(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: colors as NSArray as CFArray, locations: locations) else {
return nil
}
//draw the gradient
context.drawLinearGradient(gredient, start: CGPoint(x:0.0,y:size.height), end: CGPoint(x:size.width,y:size.height), options: [])
// Generate the image (the defer takes care of closing the context)
return UIGraphicsGetImageFromCurrentImageContext()
}

然后我将分段控件的tintColor设置为渐变:

    let gradientImage = gradient(size: listSegmentedControl.frame.size, color: [UIColor.black, UIColor.red])!
listSegmentedControl.tintColor = UIColor(patternImage: gradientImage)

那是行不通的。但是,相同的代码适用于设置 backgroundColor:

    let gradientImage = gradient(size: listSegmentedControl.frame.size, color: [UIColor.black, UIColor.red])!
listSegmentedControl.backgroundColor = UIColor(patternImage: gradientImage)

有人知道为什么吗?我真的需要设置 gradient tintColor。非常感谢任何帮助。

编辑:

理想情况下,我希望我的分段控件看起来像这样:

enter image description here

最佳答案

这是一个已知的改变 UISegmentedControl 颜色的技巧

   let sortedViews = listSegmentedControl.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } )

for (index, view) in sortedViews.enumerated() {
if index == listSegmentedControl.selectedSegmentIndex {
view.tintColor = UIColor(patternImage: gradientImage)
} else {
view.tintColor = UIColor.gray //Whatever the color of non selected segment controller tab
}
}

虽然看起来像一个丑陋的 hack,但我已经使用了很长一段时间并且看起来相当简单。希望对您有所帮助。

编辑:

这是你需要的伙计吗?

enter image description here

如果是,让我知道,我会发布相同的代码。

编辑 2:

正如 OP 在他的评论中提到的,他期望的输出与我在上图中显示的输出相同,并提供相同的代码。

免责声明:

rmaddy 所述在他下面的评论中,这是一个 hack 并利用未记录的(虽然完整的公共(public) API)但是一个非常众所周知的 hack 来改变从 iOS 5 开始就存在的 UISegemntedControl 的色调(这就是我记得的方式,让我知道是否我错了)

因此请谨慎使用答案,在未来的 iOS 版本中,Apple 可能 更改 UISegemntedControl 中 subview 的结构,并可能影响您的 O/P。我看不到的任何东西都不会导致崩溃,但可能会影响 O/P 在屏幕上的呈现方式。

我已经声明了一个变量,这样 GradientImage 只能生成一次,但是您可以按照自己的方式使用它,这取决于您的实现

var gradientImage : UIImage! = nil

ViewDidLoad 中,我将 gradientImageUISegmentedControl 初始化为

override func viewDidLoad() {
super.viewDidLoad()
gradientImage = gradient(size: segmentControl.frame.size, color: [UIColor.black, UIColor.red])!

//I have specified custom font need not necessarily be used
//Font color attribute is important though, usually `UISegementedControl` title takes color from tint color, because we might need a different color for text to highlight above gradient color am using custom font colors

let font = UIFont(name: "HelveticaNeue-Medium", size: 20)
segmentControl.setTitleTextAttributes([NSFontAttributeName : font!, NSForegroundColorAttributeName : UIColor.blue], for: .normal)
segmentControl.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.white], for: .selected)

//Set the border color and border to `UISegmentedControl` and also make it round corner

segmentControl.layer.borderColor = UIColor(patternImage: gradientImage).cgColor
segmentControl.layer.borderWidth = 2
segmentControl.layer.masksToBounds = true
segmentControl.layer.cornerRadius = 10

//In order to update the selected Segment tint and background color we need to call multiple statements every time selection changes hence I have moved it to the function and called it in viewDidLoad

updateGradientBackground()
}

最后 updateGradientBackground 的函数定义和我原来的回答里的一样

fileprivate func updateGradientBackground() {
let sortedViews = segmentControl.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } )
for (index, view) in sortedViews.enumerated() {
if index == segmentControl.selectedSegmentIndex {
//very important thing to notice here is because tint color was not honoring the `UIColor(patternImage` I rather used `backgroundColor` to create the effect and set clear color as clear color
view.backgroundColor = UIColor(patternImage: self.gradientImage)
view.tintColor = UIColor.clear
} else {
//very important thing to notice here is because tint color was not honoring the `UIColor(patternImage` I rather used `backgroundColor` to create the effect and set clear color as clear color
view.backgroundColor = UIColor.white //Whatever the color of non selected segment controller tab
view.tintColor = UIColor.clear
}
}
}

最后在UISegmentedControl的IBAction中,直接调用

@IBAction func segmentControllerTapped(_ sender: UISegmentedControl) {
self.updateGradientBackground()
}

希望对你有帮助

关于ios - 分段控件中的渐变色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51140891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com