iphone ios7 segmentado UISegmentedControl solo cambia el color del borde

Has estado buscando e intentando cambiar solo el color del borde (con un color de text diferente) sin suerte. Puede cambiar el tinte, pero cambia tanto el text como el borde.

Puede usar el proxy UIAppearance para establecer los attributes de text del título pero preservar tintColor para los bordes. Algo como:

[[UISegmentedControl appearance] setTitleTextAttributes:@{ NSForegroundColorAttributeName : [UIColor networkingColor] } forState:UIControlStateNormal]; 

Editar:

Para enmarcar imágenes, puede usar algo como esto en la categoría en UImage:

 - (instancetype)tintedImageWithColor:(UIColor *)tintColor { UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0); CGContextRef context = UIGraphicsGetCurrentContext(); CGRect rect = (CGRect){ CGPointZero, self.size }; CGContextSetBlendMode(context, kCGBlendModeNormal); [self drawInRect:rect]; CGContextSetBlendMode(context, kCGBlendModeSourceIn); [tintColor setFill]; CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

Prefiero una solución diferente (sin categoría), cuando configura imágenes para UISegmentedControl de lo que tiene que alterar imágenes como esa:

 NSArray *items = nil; if (NSFoundationVersionNumber>NSFoundationVersionNumber_iOS_6_1) { items = @[ [[UIImage imageNamed:@"Images_Icon_Notes.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal], [[UIImage imageNamed:@"Images_Icon_Keywords.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal], [[UIImage imageNamed:@"Images_Icon_Actionitems.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal], [[UIImage imageNamed:@"Images_Icon_Questions.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal] ]; } else { items = @[ [UIImage imageNamed:@"Images_Icon_Notes.png"], [UIImage imageNamed:@"Images_Icon_Keywords.png"], [UIImage imageNamed:@"Images_Icon_Actionitems.png"], [UIImage imageNamed:@"Images_Icon_Questions.png"] ]; } UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:items]; segmentedControl.tintColor = [UIColor greenColor]; // desinetworking color of border 

Ahora tintColor tendrá impacto solo en el borde, no en los íconos.

if proporciona compatibilidad con versiones anteriores de iOS.
Debo decir que esta image imageWithRenderingMode: es una de las mejores API WTF que he visto.

Lo que funcionó para mí: como sugieren otras respuestas, cambie el color de tinte de segmentedControl a clearColor. Y tinte manualmente las imágenes en el color de tinte de su aplicación.

Recuerde utilizar la image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal en la image tintada

 -(UIImage *)tintedImage:(UIImage *)image withColor:(UIColor *)tintColor { UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0); CGContextRef context = UIGraphicsGetCurrentContext(); CGRect rect = (CGRect){ CGPointZero, image.size }; CGContextSetBlendMode(context, kCGBlendModeNormal); [image drawInRect:rect]; CGContextSetBlendMode(context, kCGBlendModeSourceIn); [tintColor setFill]; CGContextFillRect(context, rect); UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return [newImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; } 

Puede cambiar primero el tintColor y después el títuloTexto.

 //Changes Tint Color segmentedControlName.tintColor = [UIColor colorWithRed:0/255 green:0/255 blue:0/255 alpha:1]; //TitleText to BlackColor [[UISegmentedControl appearance] setTitleTextAttributes:@{ NSForegroundColorAttributeName : [UIColor blackColor] } forState:UIControlStateNormal]; 

Mi solución otorga otro color al borde del control segmentado y mantiene el text como el color del tinte.

Para cambiar solo el color del borde del control segmentado, coloca otro control segmentado sobre el anterior. Luego, desactiva la interacción del usuario con esta nueva, y configuro la image para el segmento seleccionado en nil.

 UISegmentedControl *segCtrl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Segm 1", @"Segm 2", @"Segm 3", @"Segm 4", nil]]; // The UISegmentedController which you want to change the border color for [segCtrl setFrame:CGRectMake(5, 5, [UIScreen mainScreen].bounds.size.width - 10, 30)]; [segCtrl setSelectedSegmentIndex:0]; [segCtrl setTintColor:[UIColor networkingColor]]; UISegmentedControl *bcg = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@" ", @" ", @" ", @" ", nil]]; // The UISegmentedController you put on top of the other one [bcg setFrame:CGRectMake(5, 5, [UIScreen mainScreen].bounds.size.width - 10, 30)]; [bcg setSelectedSegmentIndex:0]; [bcg setImage:nil forSegmentAtIndex:0]; // Removing highlight color [bcg setTintColor:[UIColor greenColor]]; [bcg setUserInteractionEnabled:NO]; [[self view] addSubview:segCtrl]; [[self view] addSubview:bcg]; 

Por supuesto, debes cuidar el encuadre y el color para adaptarse a tu aplicación. Aparte de eso, este código debería estar listo.

  for (int i=0; i<[mySegmentedControl.subviews count]; i++) { if ([[mySegmentedControl.subviews objectAtIndex:i]isSelected] ) { [[mySegmentedControl.subviews objectAtIndex:i] setBackgroundColor:[UIColor blueColor]]; [[mySegmentedControl.subviews objectAtIndex:i] setTintColor:[UIColor clearColor]]; } else { [[mySegmentedControl.subviews objectAtIndex:i] setBackgroundColor:[UIColor whiteColor]]; [[mySegmentedControl.subviews objectAtIndex:i] setTintColor:[UIColor clearColor]]; } }