2012-06-25 16 views
5

Estoy configurando el aspecto del control segmentado a través de estas declaraciones en el delegado de la aplicación.Comportamiento extraño con UISegmentedControl y UIAppearance

[[UISegmentedControl appearance] setBackgroundImage:[[UIImage imageNamed:@"segmentation_normal.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0 , 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
    [[UISegmentedControl appearance] setBackgroundImage:[[UIImage imageNamed:@"segmentation_selected.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0 , 0, 0)] 
     forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 

    [[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"segmentation_divider_NormalNormal.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
    [[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"segmentation_divider_NormalSelected.png"] forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 
    [[UISegmentedControl appearance] setDividerImage:[UIImage imageNamed:@"segmentation_divider_SelectedNormal.png"] forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

El resultado es bueno. Los fondos y divisores se configuran correctamente cuando selecciono alguno de los segmentos (el segmento de pedido se selecciona de manera predeterminada cuando se inicia la aplicación por primera vez). Cuando selecciono el segmento Release, como puede ver a continuación, todo se ve bien.

enter image description here

El problema es cuando salgo de la vista, entonces volver a la vista (I almacenar el índice seleccionado y el conjunto en el viewDidLoad volver a seleccionar el segmento), el divisor se establece incorrectamente por alguna desconocida razón.

enter image description here

Si giro en la A-Z luego suelte, se corrige a sí mismo. Este error solo ocurre cuando la vista primero se carga y el segmento seleccionado fue Release o A-Z. El divisor siempre se ve bien cuando se selecciona Pedido y se carga la vista.

Tamaños de imagen: el divisor es de 2px de ancho (las 3 imágenes son del mismo tamaño), los fondos son de 2 px de ancho cada uno.

Cualquier idea o sugerencia sería muy apreciada, he estado tirando de mi cabello durante las últimas 10 horas tratando de encontrar una solución para no disponible.

+0

Llame al método 'setNeedsDisplay' de' UISegmentedControl' después de establecer el índice seleccionado de 'UISegmentedControl' en' viewDidLoad'. Tal vez eso solucionará el problema. –

+0

No funcionó. ¡Gracias! –

+0

Estoy viendo este problema también. Maldición :( – runmad

Respuesta

7

Esto es un error con UISegmentedControl, creo. Puede solucionarlo configurando el segmento seleccionado después de un retraso, para permitir que el tiempo de control se dibuje a sí mismo. Ni siquiera tiene que usar un retraso real, apenas algo como:

[self performSelector:@selector(setPreferences) withObject:nil afterDelay:0.0]; 

Dónde setPreferences actualiza el valor de su control segmentado.

+0

funcionó tan bien. Pero me pregunto cuál podría ser la razón real detrás de esto? – thesummersign

+1

porque se realizará después del primer ciclo de ejecución (control segmentado ya dibujado)! este error es un error conocido y solucionado en iOS 6 –

+0

puedo confirmar que esto funciona. Muchas gracias. – glasz