Personalización de UISegmentedControl en iOS 5

Aquí está mi problema. Estoy personalizando un UISegmentedControl configurando el background y las imágenes divisorias de la siguiente manera:

[[UISegmentedControl appearance] setDividerImage:segmentUnselectedUnselected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setBackgroundImage:segmentUnselected forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 

Cuando trato de hacer que el 1º segmentado se select dentro de viewDidLoad

 self.segmentedControl.selectedIndex = 1; 

Me sale la siguiente cosa extraña:

introduzca la descripción de la imagen aquí

en lugar de:

introduzca la descripción de la imagen aquí

¿Alguien sabe si este es un error y cómo podría proporcionar un informe de error? Si no, ¿qué podría estar mal con mi código?

Después de hacer algunas testings e intentar varias ubicaciones diferentes para la personalización, creo que esto puede ser un error.

Incluso con un control UISegmentedStrol muy simple, esto es lo que obtengo (usando Xcode 4.3.1, iOS 5.1):

Después de iniciar y seleccionar el elemento central en el código: Después de iniciar y seleccionar el elemento medio en el código

Después de que el usuario hizo clic y se vuelve a hacer clic en el elemento del medio: Después de que el usuario hizo clic y se vuelve a hacer clic en el elemento del medio

Utilicé imágenes de 3px de ancho para los separadores y 1px de imágenes de ancho para los backgrounds.

Editar : Creo que encontré una solución: intente poner en queue las instrucciones para seleccionar el elemento, en lugar de ejecutarlo en viewDidLoad, así:

 dispatch_async(dispatch_get_main_queue(),^{ self.segmentedControl.selectedSegmentIndex = 1; }); 

En mi ejemplo anterior, poner en queue esa instrucción hace que funcione bien.

Creo que su image CapInsets es incorrecta, duplique el ejemplo en http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5

aquí hay algunos códigos del Tutorial para reference rápida:

 UIImage *segmentSelected = [[UIImage imageNamed:@"segcontrol_sel.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)]; UIImage *segmentUnselected = [[UIImage imageNamed:@"segcontrol_uns.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 15)]; UIImage *segmentSelectedUnselected = [UIImage imageNamed:@"segcontrol_sel-uns.png"]; UIImage *segUnselectedSelected = [UIImage imageNamed:@"segcontrol_uns-sel.png"]; UIImage *segmentUnselectedUnselected = [UIImage imageNamed:@"segcontrol_uns-uns.png"]; [[UISegmentedControl appearance] setBackgroundImage:segmentUnselected forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setDividerImage:segmentUnselectedUnselected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setDividerImage:segmentSelectedUnselected forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UISegmentedControl appearance] setDividerImage:segUnselectedSelected forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 

Descubrí cómo resolver el problema después de hacer muchos experimentos.

Su problema es el ajuste de ancho incorrecto para los segmentos.

Primer punto: necesitamos personalizar la interfaz de usuario antes de establecer el ancho de los segmentos individuales.

Segundo punto: necesitamos contar el ancho del divisor (es) y es muy importante. Cuando hacemos la personalización, los divisores son parte de los elementos UISegmentedControl. El divisor no es una superposition. Deberíamos contar también el ancho del divisor.

Tercer punto: cuando usamos el método set width para los segmentos, el ancho del segmento no necesita include el ancho del divisor.

Si sigues las reglas anteriores, obtendrás un UISegmentedControl personalizado perfecto.

¿Has intentado configurar imágenes networkingimensionables?

Por ejemplo:

 UIImage *segmentSelected = [[UIImage imageNamed:@"SegmentSelectedImage"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 5)]; [[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 

Es posible que desee probar la initialization de su configuration de aspecto antes de viewDidLoad . En las demostraciones he visto que esto se hacía generalmente en la application:didFinishLaunchingWithOptions: aunque cualquier punto antes de cargar la punta que contiene las vistas personalizadas debería funcionar.

Tuve el mismo problema y lo resolví de otra manera. Acabo de comentar esta línea de código:

 self.pageController.segmentedControlStyle = UISegmentedControlStyleBar; 

Y la barra de segmentos cambió su vista al estado normal.