Tengo un UISegmentedControl en mi aplicación. Como de iOS7 GM, las imágenes que uso no se muestran cuando se ejecuta en dispositivos iOS7. Alguien más tiene este problema?

Aquí es lo que parece en iOS6.1 y anterioresUISegmentedControl setImage: Error en iOS7
.

y aquí es lo que se ve en iOS7UISegmentedControl setImage: Error 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?

  • no es un pero, es una característica! Apple hizo el muy extraña elección de color completamente las imágenes en su segmentado controles. Yo mi app he utilizado un seg para elegir un color, ahora que mis colores son de color azul!
InformationsquelleAutor kevmalek | 2013-09-11

4 Comentarios

  1. 61

    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];
    • Esa no es la ‘solución’ que se llama explícitamente a cabo en uno de los WWDC vídeos como una cosa necesaria para hacer en ese caso
    • El código sin el nuevo método de trabajo en iOS6.1 e inferior y se detuvo en 7. No hay ninguna indicación en la documentación o de la consola para hacer algo diferente. La carga de la responsabilidad no reside en mí ver a todo el WWDC videos. Voy a seguir adelante y llamar a esto un error, gracias.
    • ¿Volver a compilar el código con el nuevo SDK? El docs claramente estado que: Segmento de los Iconos Se puede utilizar una imagen en lugar de texto de título para sus segmentos. Tenga en cuenta que un segmento de la imagen será automáticamente se representa como una imagen de la plantilla dentro de una segmentación de control, a menos que se establezca explícitamente su modo de representación a UIImageRenderingModeAlwaysOriginal. Para obtener más información, consulte la Plantilla de Imágenes (yo no soy la vinculación a la misma, ya que el vínculo es todavía pre-release)
    • Tienes razón, el comportamiento que se menciona en la guía de transición, gracias.
    • He probado esto, pero la imagen me puse en no scalling para llenar el segmento. consulte stackoverflow.com/questions/18850081/…
    • Yo intente este fragmento de código en mi app,s worked.so,whats la conclusión,debo usar esto ?
    • Sí el uso de este. Esto no es una solución, es más bien el nuevo comportamiento de la UISegmentedControl adelante en iOS7.
    • Creo que el único problema es que por defecto el renderingMode debe ser UIImageRenderingModeAlwaysOriginal

  2. 17

    ACTUALIZACIÓN de Xcode 6/iOS 8

    Ahora usted puede hacerlo en el Interface builder

    Acaba de agregar el archivo de imagen en el catálogo de activos y establecer su «render como» original de la imagen en lugar de la predeterminada

    Xcode 5

    La nueva UISegmented control utiliza los colores de tinte para teñir las imágenes utilizando el modo de plantilla.
    Que se necesita para el procesamiento de estas imágenes como original y no de las plantillas.

    Como se sugiere en los comentarios hacerlo:

    UIImage* onceActive = [UIImage imageNamed:@"btn_onceActive"];
    if (IOS_7_MACRO)
        onceActive = [onceActive imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    [self.theSegmentedControl setImage:onceActive forSegmentAtIndex:0];
    • ¿Cómo puedes saber al usuario de la AlwaysOriginal el Modo de Representación de la XIB/Interface Builder?
    • Que no me aparece esa opción en el IB al menos para UISegmentedControl 🙁
    • Como de Xcode 6 se puede establecer el modo de procesamiento en los Activos de propiedades de catálogo para cada uno de los activos 😀
    • Parece que iOS 7 omite este valor. Estoy usando Xcode 6.1, y la configuración funciona cuando se ejecuta en iOS 8, pero no de iOS 7.
    • gracias, he actualizado la respuesta. No prueba a mí mismo en iOS 7 y demasiado perezoso ahora para hacerlo 😀
    • He encontrado que, incluso la configuración de los activos de propiedad correctamente no es suficiente, necesito darle una patada con algo como esto:

  3. 7

    Utilizar este Código para establecer la Imagen en el Segmento de Control 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];
    }
  4. 2

    Podría ser útil para 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 simplemente llame a

    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
        [colorSegmentedControl setImageRenderingMode:UIImageRenderingModeAlwaysOriginal];
    • imageWithRenderingMode: ya está presente en UIImage. Entonces, ¿por qué crear categoría? Sólo disponible en iOS 7.0 en adelante.
    • Sí, imageWithRenderingMode: es también un UIImage método: en este ejemplo se está utilizando. ¿Por qué crear una categoría? Porque es menos detallado y útil que configurar manualmente los controles. Pero, por supuesto, es aún mejor mediante la creación de su propio UISegmentedControl clase.

Dejar respuesta

Please enter your comment!
Please enter your name here