Swift: changing the background color in the selected UISegmentControl segment

In my Swift application, I do not know how to change the BGColor for the selected segment myself, in UISegmentControl. I tried a lot, only the hue of the color changes. I got success in Objective-C. I do not know how to convert this to SWIFT. Please guide me. My encodings are below:

Goal 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];
        }
    }
}

Swift

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

Exit

enter image description here

+5
source share
8 answers

The problem with Swift code is optional processing: it (sender.subviews[i].isSelected) != nilwill be true even if it isSelectedis false.

Try writing your loop using Swift syntax

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

, , subview , .

+2

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()
+11

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
    }
}
+4

@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
            }
        }
+1

, , , , 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
        }
    }
}
0

For Swift: When clicking on segment control (@IBAction) use the following code

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

create segmentedControl output and in viewDidLoad you need to call the function above.

self.segmentChanged(segmentedControl)
0
source

Updating @gabo's answer in Swift 4.1 as I don’t have permission to modify its answer.

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

}

The originally selected segment in viewDidLoad

let sortedViews = segmentedControlOutletVariable.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } )
sortedViews[0].tintColor = UIColor.blue //Default Selection color
0
source

iOS 13 and Swift 5

Try using this extension:

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;
    }
}

}

Call:

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

Source: https://habr.com/ru/post/1606356/


All Articles