segmented how example control objective-c cocoa-touch uisegmentedcontrol ios7

objective c - how - UISegmentedControl setImage: Error en iOS7



swift 4 segmented control example (4)

Tengo un UISegmentedControl en mi aplicación. A partir de iOS7 GM, las imágenes que uso no aparecen cuando se ejecutan en dispositivos iOS7. ¿Alguién mas está teniendo este problema?

Esto es lo que parece en iOS6.1 y anteriores .

Y aquí está lo que parece en iOS7 .

Aquí está el código:

self.theSegmentedControl.frame = CGRectMake(self.theSegmentedControl.frame.origin.x, self.theSegmentedControl.frame.origin.y, 320, 35); [self.theSegmentedControl setBackgroundImage:[UIImage imageNamed:@"img_toggleInactive"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [self.theSegmentedControl setImage:[UIImage imageNamed:@"btn_onceActive"] forSegmentAtIndex:0]; [self.theSegmentedControl setImage:[UIImage imageNamed:@"btn_recurringInactive"] forSegmentAtIndex:1]; [self.theSegmentedControl setImage:[UIImage imageNamed:@"btn_scheduledInactive"] forSegmentAtIndex:2]; [self.theSegmentedControl setDividerImage:[UIImage imageNamed:@"separator"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

¿Alguien ha encontrado una solución a esto?


¡Woohoo! Aquí está la solución:

//Add clear color to mask any bits of a selection state that the object might show around the images self.theSegmentedControl.tintColor = [UIColor clearColor]; UIImage *onceActive; UIImage *recurringActive; UIImage *scheduledActive; UIImage *separator; //Setting imageWithRenderingMode: to imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal for iOS7 is key if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) { onceActive = [[UIImage imageNamed:@"btn_onceActive"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; recurringActive = [[UIImage imageNamed:@"btn_recurringInactive"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; scheduledActive = [[UIImage imageNamed:@"btn_scheduledInactive"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; separator = [[UIImage imageNamed:@"separator"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; } else { onceActive = [UIImage imageNamed:@"btn_onceActive"]; recurringActive = [UIImage imageNamed:@"btn_recurringInactive"]; scheduledActive = [UIImage imageNamed:@"btn_scheduledInactive"]; separator = [UIImage imageNamed:@"separator"]; } [self.theSegmentedControl setImage:onceActive forSegmentAtIndex:0]; [self.theSegmentedControl setImage:recurringActive forSegmentAtIndex:1]; [self.theSegmentedControl setImage:scheduledActive forSegmentAtIndex:2]; [self.theSegmentedControl setDividerImage:separator forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];


Podría ser útil crear una categoría:

@interface UISegmentedControl (UISegmentedControlAdditions) -(void)setImageRenderingMode:(UIImageRenderingMode)renderingMode; @end @implementation UISegmentedControl (UISegmentedControlAdditions) -(void)setImageRenderingMode:(UIImageRenderingMode)renderingMode { for (int index=0; index < [self numberOfSegments]; index++) { UIImage * image = [self imageForSegmentAtIndex:index]; [self setImage:[image imageWithRenderingMode:renderingMode] forSegmentAtIndex:index]; } }

... y solo llama

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) [colorSegmentedControl setImageRenderingMode:UIImageRenderingModeAlwaysOriginal];


Use este código para configurar la imagen en el control de segmento en iOS 7 con xCode 5.0

if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) { [segmentControl setImage:[[UIImage imageNamed:@"image.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forSegmentAtIndex:0]; } else { [segmentControl setImage:[UIImage imageNamed:@"image.png"] forSegmentAtIndex:0]; }


ACTUALIZACIÓN para Xcode 6 / iOS 8

Ahora puedes hacerlo en Interface builder.

Solo agregue el archivo de imagen en el catálogo de activos y configure su imagen "render as" como original en lugar de predeterminada

Xcode 5

El nuevo control UISegmented usa el color de tinte para teñir las imágenes usando el modo de plantilla. Deberá renderizar estas imágenes como originales y no como plantillas.

Como se sugiere en los comentarios, haga esto:

UIImage* onceActive = [UIImage imageNamed:@"btn_onceActive"]; if (IOS_7_MACRO) onceActive = [onceActive imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; [self.theSegmentedControl setImage:onceActive forSegmentAtIndex:0];