自定义 UISegmented Control 中每个段的字体颜色

Customise font color of each segment in UISegmented Control

我正在尝试配置分段控制栏。

目标是让每段文字的字体颜色不同。所以它应该是这样的: example

我读了很多主题,包括这个: 但主要是讨论如何使色调颜色不同。我尝试在正常模式下使颜色不同。

一个想法是递归遍历段的视图层次结构并检查是否遇到 UILabel

正常设置您的UISegmentControl

func addControl()  {
    let items = ["One", "Two", "Three"]
    let segmentedControl = UISegmentedControl(items: items)
    segmentedControl.frame = CGRect(x: 35, y: 200, width: 250, height: 50)
    segmentedControl.center = view.center
    segmentedControl.selectedSegmentIndex = 1
    view.addSubview(segmentedControl)
    
    // custom function
    updateSegmentTextColor(segmentedControl)
}

此函数贯穿视图层次并设置标签的颜色

// Just for testing
func randomColor() -> UIColor
{
    let red = CGFloat(arc4random_uniform(256)) / 255.0
    let blue = CGFloat(arc4random_uniform(256)) / 255.0
    let green = CGFloat(arc4random_uniform(256)) / 255.0
    
    return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
}

private func updateSegmentTextColor(_ rootView: UIView)
{
    for subview in rootView.subviews
    {
        if let label = subview as? UILabel
        {
            // Any color you want
            label.textColor = randomColor()
        }
        
        updateSegmentTextColor(subview)
    }
}

结果:

一些最后的说明:

  • 此解决方案可能会影响您可能想要设置的其他色调属性,并且当您希望为选定和取消选定状态保持相同的文本颜色时非常有用
  • 分段控制的未来 iOS 更新和实施可能会影响它的工作方式

更新

如果要为特定段指定标题颜色,可以假设(赌博)段控件应按逻辑顺序布置其子视图。

我强调 assume 是因为这个顺序不在我们的控制范围内,你要听从执行的摆布。

事实上,如果您设置选定的索引 segmentedControl.selectedSegmentIndex = 1 并且如果您有 4 个段,则子视图的布局顺序为 0、2、3、1,因此最后添加选定的段。

适合您情况的方法如下:

// Add a color queue to hold the colors for the 4 segments
var colorQueue: [UIColor] = [.red, .blue, .green, .orange]

private func updateSegmentTextColor(_ rootView: UIView)
{
    for subview in rootView.subviews
    {
        if let label = subview as? UILabel,
           !colorQueue.isEmpty
        {
            // Dequeue the front of the queue
            let color = colorQueue.removeFirst()
            label.textColor = color
        }
        
        updateSegmentTextColor(subview)
    }
}

private func addControl()  {
    let items = ["One", "Two", "Three", "Four"]
    let segmentedControl = UISegmentedControl(items: items)
    segmentedControl.frame = CGRect(x: 35, y: 200, width: 250, height: 50)
    segmentedControl.center = view.center
    segmentedControl.tintColor = .blue
    view.addSubview(segmentedControl)
    
    // custom function
    updateSegmentTextColor(segmentedControl)
    
    // Add the selected index if you need AFTER the updates
    segmentedControl.selectedSegmentIndex = 1
}

你明白了