Personalización de UISegmentedControl en iOS 5

Aquí está mi problema. Estoy personalizando un UISegmentedControl por configurar el fondo y el divisor imágenes 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 1er segmentado seleccionado dentro de viewDidLoad

self.segmentedControl.selectedIndex = 1;

Tengo la siguiente cosa extraña:

Personalización de UISegmentedControl en iOS 5

lugar de:

Personalización de UISegmentedControl en iOS 5

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

  • ¿Tengo entendido correctamente que su control se ve muy bien cuando te manualmente pulse uno de los segmentos después de que su vista se ha cargado? O siempre se mira como en la primera imagen?
  • Estás en lo correcto. Parece que esta la primera vez que se carga la clase y el valor es establecer manualmente. Luego más adelante en la aplicación si el usuario pulsa en cualquiera de los segmentos, a continuación, se ve bien. También, si hay dos segmentado y controles de usuario cambia el valor de la primera y puedo cambiar mediante programación el valor de la segunda debido a un poco de lógica, entonces se ve bien también. Yo estoy usando el SDK de iOS 4.2 en Snow Leopard.
  • Parece que el control es el uso equivocado de divisor de imagen en el inicio (que es el uso de el para no seleccionado/no seleccionado en lugar de desactivada/activada). ¿En qué punto exactamente en la aplicación de su ciclo de vida está estableciendo la aparición de la UISegmentedControl?
  • Estoy configurando la apariencia en el método viewDidLoad
  • La he usado yo antes sin problemas. La segmentación de control del valor se carga mediante programación en el inicio de NSUserDefaults, sin embargo, no he encontrado esto antes. Si bien es posible que hay un error en el SDK, yo creo que no habría mucha más gente con este problema en este caso. Puede ayudar si se puede publicar más de código.
  • No probados: usted podría tratar de no haber seleccionado mientras se carga y, a continuación, en viewWillAppear, «seleccionar» a la que uno desea.
  • He intentado que demasiado, y no funciona!
  • Estoy de acuerdo en que esto debe ser un error. Me he puesto la aparición en didFinishLaunchingWithOptions y utiliza estirable imágenes, pero estoy teniendo el mismo problema. Probado todas las soluciones a continuación, pero sin éxito.
  • No parece existir un efecto similar (pero otro error en iOS 6. Cuando la vista es la primera carga (si se usa de dos segmentos) en la vista utiliza el mal divisor de imagen hasta cambiar mediante programación a otro segmento y la espalda de nuevo. Esto no funciona si lo haces en viewWillAppear, pero no funciona si lo haces en viewDidAppear!
  • Además del comentario de arriba este problema aparece cuando el control del estado se establece en deshabilitado.
  • Yo lo he hecho y ha funcionado bien. Utiliza usted puede cambiar de tamaño las imágenes? He utilizado un solo píxel de ancho puede cambiar de tamaño las imágenes y funcionó sin problemas.

InformationsquelleAutor nimeshdesai | 2012-02-02

6 Kommentare

  1. 10

    Después de hacer algunas pruebas y tratando de varios lugares diferentes para la personalización, creo que de hecho, esto puede ser un error.

    Incluso con una muy sencillas y rectas UISegmentedControl, esto es lo que me pasa (con Xcode 4.3.1, iOS 5.1):

    Después de su lanzamiento y seleccionar el medio de elemento en el código:
    Personalización de UISegmentedControl en iOS 5

    Después de que el usuario hace clic de distancia y hacer clic de nuevo en medio de elemento:
    Personalización de UISegmentedControl en iOS 5

    He utilizado 3px muchas imágenes de los separadores y de 1px de ancho imágenes para los fondos.

    Editar:
    Creo que he encontrado una solución: trate de la formación de colas de la instrucción para seleccionar el elemento, en lugar de ejecutarse en viewDidLoad, como este:

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

    En mi ejemplo anterior, de la cola que de la instrucción hace que funcione bien.

    • Voy a aceptar tu respuesta porque es algo que funciona para mí. Todos estos controles están en mi página de configuración, y tengo otro control para cambiar el tema. Así que, si puedo cambiar el tema (conjunto diferente de las imágenes para la segmentación de los controles), voy a mostrar una pantalla de carga después de que la vista se muestra de nuevo y se ha roto. Pero si me mudo a otro punto de vista (en este momento la vista de configuración se cancela la asignación) y si vuelvo a la vista de ajustes (donde se asigna de nuevo) la segmentación de los controles aparecen bien.
    • ¿de dónde poner esta declaración?
    • esto funcionó para mí, pero no estoy seguro de que me gusta tener a la cola de ella, parece un hack
    • ¿alguien archivo de un RDAR para esto?
    • este enfoque está trabajando, pero me rompe el formato tableview.No tengo ninguna fila si yo llamo a este último en viewdidload.
  2. 4

    Creo que su imagen CapInsets es incorrecta, por favor, haga doble el ejemplo en http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5

    aquí hay algunos códigos de el 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];
  3. 1

    Me di cuenta de cómo resolver el problema después de que hice un montón de experimentos.

    Su problema es de la incorrecta configuración del ancho de los segmentos.

    Primer punto, tenemos que hacer de personalización de la interfaz de usuario antes de ajustar la anchura de los segmentos individuales.

    Segundo punto tenemos que contar el ancho del divisor(s) y es muy importante. Cuando hacemos la personalización, el divisor(s) es la parte de la UISegmentedControl elementos. El divisor no es una superposición. Debemos contar el ancho del divisor también.

    Tercer punto – cuando se utiliza el conjunto de ancho método de los segmentos, el segmento de ancho no se debe incluir el divisor de ancho.

    Si usted sigue las reglas anteriores, se obtiene una perfecta personalizado UISegmentedControl.

    • ¿Cómo puedo obtener el ancho de la división? Y ¿el ancho de todos los segmentos han de ser las mismas?
    • El ancho del divisor es el ancho real de la división de la imagen. El ancho de cada uno de los segmentos puede variar. Al hacer UISegmentedControl de personalización, usted necesita para hacer un mejor cálculo.
    • Tengo el mismo problema, y no veo cómo se supone que funciona. En ningún punto de mi puedo configurar el segmento de ancho manualmente. El UIAppearance proxy que se supone que tener cuidado de todo esto. @user403015 podría por favor explicar como que tengo que trabajar?
    • Si estoy usando imágenes de tamaño variable, ¿cómo en la tierra «el cálculo de los anchos de» hacer alguna diferencia? ¿Nadie se esta fijo por cierto?
    • Simplemente calcular el divisor y guardar el valor calculado para el archivo?
    • ¿Divisor de imagen aumenta el margen de los segmentos?

  4. 1

    Han tratado de establecer puede cambiar de tamaño las imágenes?

    Por ejemplo:

    UIImage *segmentSelected = [[UIImage imageNamed:@"SegmentSelectedImage"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 5, 0, 5)];
    [[UISegmentedControl appearance] setBackgroundImage:segmentSelected forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
    • Esta es la forma en que lo estoy creando mis imágenes.
  5. 0

    Puede que desee probar la inicialización de la configuración de apariencia antes que viewDidLoad. En las manifestaciones que he visto se realiza generalmente en application:didFinishLaunchingWithOptions:, aunque en cualquier momento antes de la carga de la punta que contiene las vistas personalizadas debería funcionar.

    • He intentado esto, y no funciona! Estoy pensando que podría ser un error con el SDK.
    • Alguien ha votada abajo nuestras respuestas sin insertar un comentario. Estoy muy decepcionado por esto. Me puse +1 para ti. Saludos.
    • ¿Has visto mi comentario? Que tengas un buen día 😉
    • Idéntica a la anterior respuesta, que tampoco funciona.
  6. 0

    Yo tenía el mismo problema y resuelto de manera diferente. Sólo me comentó esta línea de código:

    self.pageController.segmentedControlStyle = UISegmentedControlStyleBar;

    Y el segmento de la barra cambió ver al estado normal.

    • ¿Cómo es esto relevante para la OP del problema?
    • Yo tenía el mismo problema, y es resuelto por el camino me he apuntado en el mensaje
    • Puedes editar tu respuesta para hacer una relación más clara a la pregunta en ese caso?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea