Swift:UISegmentControl的选定段中的背景颜色更改

时间:2015-09-08 06:53:28

标签: swift uisegmentedcontrol

在我的Swift应用程序中,我不知道如何在UISegmentControl中单独更改所选段的BGColor。我尝试了很多,只有色调正在改变。我在Objective - C中取得了成功。我不知道如何将其转换为SWIFT。请指导我。我的编码如下:

目标C

- (IBAction)mySeg:(UISegmentedControl *)sender {

    for (int i=0; i<[sender.subviews count]; i++)
    {
        if ([[sender.subviews objectAtIndex:i]isSelected] )
        {
            UIColor *tintcolor=[UIColor colorWithRed:255.0/255.0 green:0/255.0 blue:0/255.0 alpha:1.0];
            [[sender.subviews objectAtIndex:i] setTintColor:tintcolor];  //HERE SELECTED SEGMENT COLOR ALONE CHANGING
        }
        else
        {
            [[sender.subviews objectAtIndex:i] setTintColor:nil];
        }
    }
}

夫特

@IBAction func mySegAcn(sender: UISegmentedControl) {
for(var i : Int = 0; i < sender.subviews.count; i++)
{
    if((sender.subviews[i].isSelected) != nil) 
    {
        //var tint_Color =  UIColor(red: 1.0, green: 0, blue: 0, alpha: 1.0)

        (sender.subviews[i] as! UIView).tintColor = UIColor .redColor()  //HERE WHOLE TINT COLOR IS CHANGING
    }

    else
    {

        (sender.subviews[i] as! UIView).tintColor = nil
    }
}
}

输出

enter image description here

9 个答案:

答案 0 :(得分:11)

我尝试使用isSelected,它给出了一个错误,说该方法不存在。这是另一种没有isSelected方法

的方法

使用UISegmentControl的值更改事件按原点x值按顺序对段进行排序,然后循环并比较selectedSegmentIndex属性。以下是假设分段控制4个段的示例:

@IBAction func indexChanged(sender: UISegmentedControl) {

    let sortedViews = sender.subviews.sort( { $0.frame.origin.x < $1.frame.origin.x } )

    for (index, view) in sortedViews.enumerate() {
        if index == sender.selectedSegmentIndex {
            view.tintColor = UIColor.blueColor()
        } else {
            view.tintColor = UIColor.lightGrayColor()
        }
    }

}

然后在viewDidLoad中为最初选择的段设置tintColor,在这种情况下它是第一个:

let sortedViews = segmentedControlOutletVariable.subviews.sort( { $0.frame.origin.x < $1.frame.origin.x } )
sortedViews[0].tintColor = UIColor.blueColor()

答案 1 :(得分:3)

Swift 4

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.tintColor = UIColor.red
    } else {
        view.tintColor = UIColor.green
    }
}

答案 2 :(得分:3)

iOS 13和Swift 5

尝试使用此扩展程序:

extension UISegmentedControl{
func setSelectedSegmentColor(with foregroundColor: UIColor, and tintColor: UIColor) {
    if #available(iOS 13.0, *) {
    self.setTitleTextAttributes([.foregroundColor: foregroundColor], for: .selected)
    self.selectedSegmentTintColor = UIColor.black;
    } else {
    self.tintColor = UIColor.black;
    }
}

}

致电:

segmentedControlName.setSelectedSegmentColor(with: .white, and: .black);

答案 3 :(得分:2)

Swift代码的问题是可选的处理: 即使(sender.subviews[i].isSelected) != nil为假,isSelected也会成立。

尝试使用Swift语法编写循环

for subview in (sender.subviews as! [UIView]) {
   if (subview.isSelected) {
       subview.tintColor = UIColor.redColor()
   } 
   else {
       subview.tintColor = nil
   } 
}

至少在该循环中,您实际上是在测试子视图是否被选中,而不是视图是否为零。

答案 4 :(得分:1)

根据@MiKL的建议,以下代码工作正常。

<强>代码

for(var i : Int = 0; i < sender.subviews.count; i++)
        {
            if ((sender.subviews[i].isSelected) == true)
            {
                (sender.subviews[i] as! UIView).tintColor = UIColor .redColor()
            }
            else
            {
                (sender.subviews[i] as! UIView).tintColor = nil
            }
        }

答案 5 :(得分:1)

我希望每个突出显示的细分都具有不同的颜色,并找到了非常简单的解决方案,这就是仅更改Switch中每个Case的selectedSegmentTintColor的颜色。

这是使用Swift 5.1

@IBOutlet weak var mySegOutlet: UISegmentedControl!


@IBAction func mySegmentControl(_ sender: UISegmentedControl) {
    switch sender.selectedSegmentIndex {
    case 0:
        mySegOutlet.selectedSegmentTintColor = .red

    case 1:
        mySegOutlet.selectedSegmentTintColor = .yellow

    case 2:
        mySegOutlet.selectedSegmentTintColor = .white

    case 3:
        mySegOutlet.selectedSegmentTintColor = .orange

    case 4:
        mySegOutlet.selectedSegmentTintColor = .red

    default:
        break
    }  //end of Switch
}

请记住在ViewDidLoad中设置文本颜色-颜色混合很重要。

mySegOutlet.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: UIControl.State.selected)

这对我来说非常顺利,并通过圆角和良好的视觉效果为我提供了所需的结果,并且您无需设置细分的背景色,因此在以下情况下无需重置背景色离开细分市场。

答案 6 :(得分:0)

您的更改颜色代码工作正常唯一的问题是如果条件不能以相同的方式工作在目标c中。

如果条件改变

 if(sender.selectedSegmentIndex != i)

@IBAction func action(sender: UISegmentedControl) {
    for(var i : Int = 0; i < sender.subviews.count; i++)
    {
        if(sender.selectedSegmentIndex != i)
        {
            //var tint_Color =  UIColor(red: 1.0, green: 0, blue: 0, alpha: 1.0)

            (sender.subviews[i] as! UIView).tintColor = UIColor .redColor()

            //HERE WHOLE TINT COLOR IS CHANGING
        }

        else
        {

            (sender.subviews[i] as! UIView).tintColor = nil
        }
    }
}

答案 7 :(得分:0)

对于Swift: 在段控件上单击(@IBAction)使用以下代码

@IBAction func segmentChanged(sender: UISegmentedControl) {
    let sortedSubViews = sender.subviews.sort { $0.frame.minX < $1.frame.minX }
    let selectedSegment = sortedSubViews[sender.selectedSegmentIndex]
    sortedSubViews.forEach({
        // white is selected color and cayan color is for not selected item 
        $0.tintColor = $0 == selectedSegment ? UIColor.whiteColor() : UIColor.cyanColor()
    })
}

创建segmentedControl的出口,在viewDidLoad上你需要调用上面的函数。

self.segmentChanged(segmentedControl)

答案 8 :(得分:0)

在Swift 4.1中更新@gabo答案,因为我没有权限修改他的答案。

@IBAction func indexChanged(sender: UISegmentedControl) { 

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

            for (index, view) in sortedViews.enumerated() {
                if index == sender.selectedSegmentIndex { //When selected
                    view.tintColor = UIColor.blue
                } else {//Unselected
                    view.tintColor = nil
                }
            }

}

viewDidLoad

中最初选择的细分受众群
let sortedViews = segmentedControlOutletVariable.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } )
sortedViews[0].tintColor = UIColor.blue //Default Selection color