SelectedTintColor of Segment Control is not rounded corner on iOS 13

I was facing the same issue on iOS 13. Then I dug into its view hierarchy then I found it has multiple subviews. So I made a trick for iOS 13. You have to do following changes for iOS 13 -

  1. ChangeselectedSegmentTintColor to Clear - self.selectedSegmentTintColor = .clear
  2. Add following code snippet inside layoutSubviews -

    for i in 0...subviews.count - 1{
    
            if let subview = subviews[i] as? UIImageView{
    
                if i == self.selectedSegmentIndex {
    
                    subview.backgroundColor = UIColor(red: 170.0/255.0, green: 170.0/255.0, blue: 170.0/255.0, alpha: 1.0)
    
                }else{
    
                    subview.backgroundColor = .clear
                }
    
            }
        }
    

I hope it will help you.


Swift 5

If you use a subclass:

override func layoutSubviews() {
    super.layoutSubviews()
    roundCorners(radius: frame.height / 2)

    if #available(iOS 13.0, *) {
        selectedSegmentTintColor = .clear
    } else {
        tintColor = .clear
    }

    for (index, subview) in subviews.enumerated() {
        if ((subviews[index] as? UIImageView) != nil) && index == selectedSegmentIndex {
            subview.backgroundColor = .white
            subview.roundCorners(radius: subview.frame.height / 2)
        } else {
            subview.backgroundColor = .clear
        }
    }
}

private func roundCorners(radius: CGFloat) {
    layer.roundCorners(radius: radius)
    self.clipsToBounds = true
}

If you use the default segmented control, you just prefix with name of your segmented control:

mySegmentedControl.selectedSegmentTintColor = .clear

for (index, subview) in mySegmentedControl.subviews.enumerated() {
   .....
}