¿Cómo puedo cambiar el estilo para UISegmentedControl cuando el usuario lo selecciona en Swift?

Este es mi UISegmentedControl escrito en Swift:

introduzca la descripción de la imagen aquí

Lo creé con el siguiente código:

 let selectedAttributes: NSDictionary = [ NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: fontForSegmentedControl! ] let normalAttributes: NSDictionary = [ NSForegroundColorAttributeName: UIColor.gray, NSFontAttributeName: fontForSegmentedControl! ] mySegmentedControl.setTitleTextAttributes(selectedAttributes as [NSObject : AnyObject], for: UIControlState.selected) mySegmentedControl.setTitleTextAttributes(normalAttributes as [NSObject : AnyObject], for: UIControlState.normal) 

y la extensión para eliminar bordes está aquí:

 extension UISegmentedControl { func removeBorders() { setBackgroundImage(imageWithColor(color: UIColor.white/*backgroundColor!*/), for: .normal, barMetrics: .default) setBackgroundImage(imageWithColor(color: tintColor!), for: .selected, barMetrics: .default) setDividerImage(imageWithColor(color: UIColor.clear), forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default) } // create a 1x1 image with this color private func imageWithColor(color: UIColor) -> UIImage { let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0) UIGraphicsBeginImageContext(rect.size) let context = UIGraphicsGetCurrentContext() context!.setFillColor(color.cgColor); context!.fill(rect); let image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image! } } 

Pero hay una cosa mal con eso.

Cuando toco (y sostengo) el ONE o TWO cambia el color de background a este (durante el time que está siendo tocado por el dedo del usuario):

introduzca la descripción de la imagen aquí

Me falta un código para cambiar el estilo de la opción seleccionada (temporal presionada) en UISegmentedControl .

¿Cómo puedo eliminar la selección de gris oscuro y dejarla con un color claro?

De manera similar a como ya ha configurado la image de background para UIControlState.normal , debe establecer las imágenes adecuadas para UIControlState.highlighted y UIControlState.selected + UIControlState.highlighted .

Agregue el siguiente código a su function de extensión removeBorders() (suponiendo que desea tener un background claro para el segmento presionado no seleccionado y un background de color tinte para presionar uno seleccionado):

 setBackgroundImage(imageWithColor(color: .clear), for: .highlighted, barMetrics: .default) setBackgroundImage(imageWithColor(color: tintColor!), for: [.selected, .highlighted], barMetrics: .default) 
 let normalAttributes: NSDictionary = [ NSForegroundColorAttributeName: UIColor.gray, NSFontAttributeName: fontForSegmentedControl! ] mySegmentedControl.setTitleTextAttributes(selectedAttributes as [NSObject : AnyObject], for: UIControlState.selected) 

El código anterior solo agrega gris para la selección, así que modifíquelo como a continuación.

 let normalAttributes: NSDictionary = [ NSForegroundColorAttributeName: UIColor.white, NSFontAttributeName: fontForSegmentedControl! ] mySegmentedControl.setTitleTextAttributes(selectedAttributes as [NSObject : AnyObject], for: UIControlState.selected)