Search code examples
uisegmentedcontroluicolorios11uifontswift4

Remove tint color but keep font color UISegmentedControl


I would like to remove the selected color from my UISegmetedControl. I know tintColor can do this but that also removes the font color with it. Also using kCTForegroundColorAttributeName will remove both.

Side note I made a UIView and placed it above the selected segment to show selected state. I thought this would look better. Trying to branch out and make my own custom controls.

public let topLine = UIView()

override func awakeFromNib() {
    super.awakeFromNib()
    self.removeBorders()
    setFont()
    addTopLine()
}

func setFont() {
    let font = UIFont(name: FontTypes.avenirNextUltraLight, size: 22.0)!
    let textColor = UIColor.MyColors.flatWhite
    let attribute = [kCTFontAttributeName:font]
    self.setTitleTextAttributes(attribute, for: .normal)
}

func addTopLine() {
    topLine.backgroundColor = UIColor.MyColors.flatWhite
    let frame = CGRect(x: 7,
                       y: -5,
                       width: Int(self.frame.size.width)/2,
                       height: 2)
    topLine.frame = frame
    self.addSubview(topLine)
}

struct FontTypes {
     static let avenirNextRegular = "AvenirNext-Regular"
     static let avenirLight = "Avenir-Light"
     static let avenirNextUltraLight = "AvenirNext-UltraLight"
}

Solution

  • TintColor is attach with

    • Background colour of Selected segment,

    • Text color of Unselected segment and

    • Border colour of UISegmentedControl.

    So, if you going to change tintColor to white, then background colour and tint color Both are gone.

    You need to set Selected/Unselected text attribute like below:

    mySegment.tintColor = .white
    
    let selectedAtrribute = [NSAttributedStringKey.foregroundColor: UIColor.red, NSAttributedStringKey.font: UIFont.systemFont(ofSize: 16)]
    mySegment.setTitleTextAttributes(selectedAtrribute as [NSObject : AnyObject], for: UIControlState.selected)
    
    let unselected = [NSAttributedStringKey.foregroundColor: UIColor.black, NSAttributedStringKey.font: UIFont.systemFont(ofSize: 16)]
    mySegment.setTitleTextAttributes(unselected as [NSObject : AnyObject], for: UIControlState.normal)