objective-c - how - swift 4 segmented control example
Personalizar UISegmentedControl en iOS 5 (6)
Aquí está mi problema. Estoy personalizando un UISegmentedControl configurando el fondo y las imágenes del divisor 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 el primer segmentado seleccionado dentro de viewDidLoad
self.segmentedControl.selectedIndex = 1;
Me sale la siguiente cosa extraña:
en lugar de:
¿Alguien sabe si esto es un error y cómo podría proporcionar un informe de error? Si no, ¿qué podría estar mal con mi código?
Descubrí cómo resolver el problema después de hacer muchos experimentos.
Su problema proviene de la configuración incorrecta de ancho para los segmentos.
Primer punto: tenemos que hacer la personalización de 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, el divisor (es) es parte de los elementos UISegmentedControl. El divisor no es una superposición. Deberíamos contar el ancho del divisor también.
Tercer punto: cuando usamos el método de ancho del conjunto para los segmentos, el ancho del segmento no necesita incluir el ancho del divisor.
Si sigue las reglas anteriores, obtendrá un UISegmentedControl personalizado perfecto.
Es posible que desee intentar inicializar su configuración de apariencia antes que viewDidLoad
. En las demostraciones que he visto esto generalmente se hacía en la application:didFinishLaunchingWithOptions:
aunque cualquier punto anterior a la carga del plumín que contiene las vistas personalizadas debería funcionar.
¿Has intentado establecer imágenes redimensionables?
Por ejemplo:
UIImage *segmentSelected = [[UIImage imageNamed:@"SegmentSelectedImage"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 5)];
[[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
Después de hacer algunas pruebas y probar varias ubicaciones diferentes para la personalización, creo que esto puede ser un error.
Incluso con un UISegmentedControl recto muy simple, esto es lo que obtengo (usando Xcode 4.3.1, iOS 5.1):
Después de iniciar y seleccionar el elemento medio en el código:
Después de hacer clic en el usuario y hacer clic en el elemento central:
Utilicé imágenes de 3px de ancho para los separadores e imágenes de 1px de ancho para los fondos.
Editar : creo que encontré una solución: intente poner en cola la instrucción 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 cola esa instrucción hace que funcione bien.
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.
Creo que su imagen CapInsets es incorrecta, por favor duplique el ejemplo en http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5
aquí hay algunos códigos del Tutorial para referencia 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];