Ios 将UIColor(patternImage:)用于UIView';什么颜色?
我正在使用一个Ios 将UIColor(patternImage:)用于UIView';什么颜色?,ios,swift,uiimage,uisegmentedcontrol,uicolor,Ios,Swift,Uiimage,Uisegmentedcontrol,Uicolor,我正在使用一个UISegmentControl,并试图为每个片段的视图提供一个自定义UIColor。这对于纯色来说很容易做到。我只是: providerSegmentedControl.subviews[1].tintColor = UIColor.red 索引1处的段现在将用红色着色 但是,我正在尝试为我的一个片段的UIView的tintColor添加渐变。我的资产中有一个名为“AppleMusicGradient”的图像,看起来像这样: 我正在尝试使用UIColor(patternIma
UISegmentControl
,并试图为每个片段的视图提供一个自定义UIColor
。这对于纯色来说很容易做到。我只是:
providerSegmentedControl.subviews[1].tintColor = UIColor.red
索引1处的段现在将用红色着色
但是,我正在尝试为我的一个片段的UIView
的tintColor
添加渐变。我的资产中有一个名为“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)
然而,这种方法似乎只起到了部分作用。当选定给定的线段时,该渐变根本不可见。如果未选择给定的线段,则渐变仅在线段内部的标签上可见,即边界通常看起来不存在
请看“苹果音乐”部分。我的解决方案感觉有点“黑”,但我相信这可能就是您想要的
@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弱var分段控制:UISegmentedControl!
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后执行任何其他设置。
self.updateGradientBackground()文件
}
私有函数updateGradientBackground(){
让SortedView=segmentedControl.SubView.sorted(按:{$0.frame.origin.x<$1.frame.origin.x})
用于SortedView.enumerated()中的(索引、视图){
如果索引==segmentedControl.selectedSegmentIndex{
view.backgroundColor=UIColor(patternImage:UIImage(名为:“7Wk4B”)!)
view.tintColor=UIColor.clear
让titleTextAttributes=[NSAttributedString.Key.foregroundColor:UIColor.white]
UISegmentedControl.appearance()
}否则{
view.backgroundColor=UIColor.white
view.tintColor=UIColor.blue
}
}
}
@iAction func segmentedControllerTapped(\发送方:任意){
self.updateGradientBackground()文件
}
我的解决方案感觉有点“黑客”,但我相信这可能就是您想要的
@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弱var分段控制:UISegmentedControl!
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后执行任何其他设置。
self.updateGradientBackground()文件
}
私有函数updateGradientBackground(){
让SortedView=segmentedControl.SubView.sorted(按:{$0.frame.origin.x<$1.frame.origin.x})
用于SortedView.enumerated()中的(索引、视图){
如果索引==segmentedControl.selectedSegmentIndex{
view.backgroundColor=UIColor(patternImage:UIImage(名为:“7Wk4B”)!)
view.tintColor=UIColor.clear
让titleTextAttributes=[NSAttributedString.Key.foregroundColor:UIColor.white]
UISegmentedControl.appearance()
}否则{
view.backgroundColor=UIColor.white
view.tintColor=UIColor.blue
}
}
}
@iAction func segmentedControllerTapped(\发送方:任意){
self.updateGradientBackground()文件
}
我在想,也许每次细分市场发生变化时都要打电话。谢谢我会尝试一下,让您知道它是如何工作的。是的,请确保您的分段控件已连接到IBOutlet和IBAction。不幸的是,我无法完全让它工作。首先,当设置子视图的backgroundColor
然后调用UISegmentedControl.appearance().setTitleTextAttributes()
时,各个片段的文本实际上不会更改。我自己运行了这个程序,当选中时它似乎会更改。背景至少会变成渐变色吗?幸运的是,背景确实变成了渐变色。我不知道为什么文字没有更新我这边的颜色。我在想也许每次片段改变时都要打电话。谢谢我会尝试一下,让您知道它是如何工作的。是的,请确保您的分段控件已连接到IBOutlet和IBAction。不幸的是,我无法完全让它工作。首先,当设置子视图的backgroundColor
然后调用UISegmentedControl.appearance().setTitleTextAttributes()
时,各个片段的文本实际上不会更改。我自己运行了这个程序,当选中时它似乎会更改。背景至少会变成渐变色吗?幸运的是,背景确实变成了渐变色。我不知道为什么我这边的文字没有更新颜色。说大卫-与你的问题无关。当你需要这样的梯度时。一件非常好的事情就是。。。。。。。。制作,而不是使用准备好的PNG。(有两个重要原因(1)节省大量空间(2)在每台设备上都能获得精确、令人敬畏、终极的分辨率。)如何:希望是这样interest@Fattie谢谢你的推荐。我避免在渐变中使用CALayer
的原因是,我不确定如何使用CALayer
为UISegmentedControl
子视图获得类似效果。i、 e.我可以使用UIImage
设置tintColor
,不确定我是否可以对CALayer
说同样的话。说David-与你的问题无关。当你需要这样的梯度时。一件非常好的事情就是。。。。。。。。制作,而不是使用准备好的PNG。(有两个重要原因(1)节省大量空间(2)在每台设备上都能获得精确、令人敬畏、终极的分辨率。)如何:希望是这样interest@Fattie谢谢你的推荐。我避免在渐变中使用CALayer
的原因是,我不确定如何使用CALayer
为UISegmentedControl
子视图获得类似效果。i、 e.我可以使用UIImage
设置tintColor
,但我不确定是否可以