¿Alguien sabe de una forma de personalizar la apariencia de la cadena de UISegmentedControl? Estoy tratando de establecer el color de fondo de la celda y el texto de color de forma diferente dependiendo del estado del elemento.

Alternativamente, usted sabe de una manera para crear UIImages sobre la marcha en el que se incluyen cadenas personalizadas? (por ejemplo, crear UUImage con fondo blanco, superposición de texto, añadir a la segmentado de control).

Yo sé que usted sólo puede tener cadenas o imágenes en la segmentación de control…

InformationsquelleAutor nicktmro | 2009-07-28

9 Comentarios

  1. 20

    UISegmentedControl tiene un tintColor propiedad-esto le permite cambiar de qué color es el control, pero no la general «estilo» (la redondeado, biselado de la forma):

    segmentedControl.tintColor = [UIColor blueColor];

    Como para la creación de UIImages sobre la marcha, puede crear un CGContext, hacer cualquier dibujo que usted necesita en ese contexto (incluidas las cadenas), y a continuación, obtener una UIImage fuera del contexto del CGImage:

    CGContextRef drawContext = CGBitmapContextCreate(<many parameters>);
    //do drawing here
    CGImageRef finalImage = CGBitmapContextCreateImage(drawContext);
    UIImage *cellImage = [UIImage finalImage];
  2. 12
    segmentedControl.tintColor = [UIColor colorWithRed:0.61176f green:0.61176f  blue:0.61176f  alpha:1.0f];
    
    segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
  3. 10

    La mayoría de las respuestas aquí no responder a la pregunta específica de cómo configurar un botón de color basado en el estado seleccionado que implica otro color que se desea para no seleccionada del estado. He luchado con esto por bastante tiempo y quería compartir mi solución para que otros la utilicen.

    Mi ejemplo se utiliza un UISegmentedControl con tres segmentos. Los seleccionados de color para todos los tres debe ser la misma para darle un aspecto uniforme. El estado seleccionado para el primer y el último segmento tiene colores únicos.

    La personalización de los colores de una UISegmentedControl

    El problema es que la segmentación de control no está garantizado a estar en el mismo orden de modo que los colores se mezclan como usted seleccione de ida y vuelta. Dan publicó una solución que utiliza las etiquetas, pero por desgracia ya no está garantizado para trabajar para iOS 6.

    La mayor parte de este código se toma de este post. He cambiado un poco para tener los colores seleccionados.

    Lo que hace que funcione es la clasificación, pero tomar nota de estas 2 líneas importantes para establecer el color seleccionado:

    NSInteger selectedIdx = betterSegmentedControl.selectedSegmentIndex;
    [[sortedViews objectAtIndex:selectedIdx] setTintColor:[self.segmentColors objectAtIndex:selectedIdx]];

    - (void) updateSegmentColors
    {
    UIColor *checkColor = [UIColor colorWithRed: 29/255.0 green:166/255.0 blue:47/255.0 alpha:1.0];
    NSArray *segmentColors = [[NSArray alloc] initWithObjects:checkColor, [UIColor blueColor], [UIColor redColor], nil];
    UISegmentedControl *betterSegmentedControl = self.StatusControl;
    //Get number of segments
    NSUInteger numSegments = [betterSegmentedControl.subviews count];
    //Reset segment's color (non selected color)
    for( int i = 0; i < numSegments; i++ ) {
    //reset color
    [[betterSegmentedControl.subviews objectAtIndex:i] setTintColor:nil];
    [[betterSegmentedControl.subviews objectAtIndex:i] setTintColor:[UIColor blueColor]];
    }
    //Sort segments from left to right
    NSArray *sortedViews = [betterSegmentedControl.subviews sortedArrayUsingFunction:compareViewsByOrigin context:NULL];
    //Change color of selected segment
    NSInteger selectedIdx = betterSegmentedControl.selectedSegmentIndex;
    [[sortedViews objectAtIndex:selectedIdx] setTintColor:[self.segmentColors objectAtIndex:selectedIdx]];
    //Remove all original segments from the control
    for (id view in betterSegmentedControl.subviews) {
    [view removeFromSuperview];
    }
    //Append sorted and colored segments to the control
    for (id view in sortedViews) {
    [betterSegmentedControl addSubview:view];
    }
    }
    NSInteger static compareViewsByOrigin(id sp1, id sp2, void *context)
    {
    //UISegmentedControl segments use UISegment objects (private API). But we can safely cast them to UIView objects.
    float v1 = ((UIView *)sp1).frame.origin.x;
    float v2 = ((UIView *)sp2).frame.origin.x;
    if (v1 < v2)
    return NSOrderedAscending;
    else if (v1 > v2)
    return NSOrderedDescending;
    else
    return NSOrderedSame;
    }

    He colocado el código en su propio método, porque estoy cargando estas segmentado controles en la vista de la tabla y la necesidad de ejecutar sobre la carga (estados existentes de almacenamiento) y cuando un usuario cambia de una selección. Ahora sólo tengo que llamar a [Self updateSegmentColors]; cuando algo cambia.

  4. 9

    Todo lo que tienes que hacer es:

    //Get an array of the subviews of a UISegmentedControl, for example myUISegmentedControl:
    NSArray *arri = [myUISegmentedControl subviews];
    //Change the tintColor of each subview within the array:
    [[arri objectAtIndex:0] setTintColor:[UIColor redColor]];
    [[arri objectAtIndex:1] setTintColor:[UIColor greenColor]];
    • no me funciona
    • Funcionó a la perfección en iOS 7… eres increíble!
    • Cosas buenas de niza solución
    • Incoherente solución, el orden puede cambiar
  5. 7

    La mejor manera que he encontrado de hacer algo como esta es la configuración de atributos diferentes para diferentes UIControlStates en la segmentación de control.

    self.segmentedControl.tintColor = [UIColor cb_Grey1Color];
    self.segmentedControl.backgroundColor = [UIColor cb_Grey3Color];
    NSDictionary *selectedAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
    [UIFont cbGothamBookFontWithSize:13.0], NSFontAttributeName,
    [UIColor whiteColor], NSForegroundColorAttributeName,
    [UIColor cb_Grey1Color], NSBackgroundColorAttributeName, nil];
    [self.segmentedControl setTitleTextAttributes:selectedAttributes forState:UIControlStateSelected];
    NSDictionary *unselectedAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
    [UIFont cbGothamBookFontWithSize:13.0], NSFontAttributeName,
    [UIColor cb_Grey2Color], NSForegroundColorAttributeName,
    [UIColor cb_Grey3Color], NSBackgroundColorAttributeName, nil];
    [self.segmentedControl setTitleTextAttributes:unselectedAttributes forState:UIControlStateNormal];
    • BackgroundColorAttribute solo cambia el fondo del título
  6. 2

    Aquí se muestra un ejemplo de código que funciona con iOS9, pero es un hack, y podría no funcionar en versiones posteriores:

    UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:@[@"Title1", @"Title2"]];
    for (id segment in [segmentedControl subviews])
    {
    for (id view in [segment subviews])
    {
    NSString *desc = [view description];
    if ([desc containsString:@"UISegmentLabel"])
    {
    [segment setTintColor:([desc containsString:@"Title1"] ? [UIColor blueColor] : [UIColor greenColor])];
    }
    }
    }
  7. 2

    Color de fuente de swift 3 y swift 4 si desea cambiar

    Para no seleccionada elemento

     segcntrl.setTitleTextAttributes(titleTextAttributes, for: .normal)

    Para el elemento Seleccionado

      segcntrl.setTitleTextAttributes(titleTextAttributes, for: .selected)
    //MARK:- Segment color change
    self.segc.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: 
    UIColor.white], for: UIControlState.selected)
    self.segc.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: 
    UIColor.white], for: UIControlState.normal)
  8. 1

    Yo era capaz de hacerlo a través de la Interfaz de Generador en XCode 6. Adjunto está el matiz de la propiedad:

    La personalización de los colores de una UISegmentedControl

  9. 1

    Quería lograr algo similar – establecer el color de fondo de que el segmento seleccionado un color, mientras que el ‘esquema’ de el resto de los segmentos eran de un color diferente.

    Préstamo pesadamente de Portland Corredor respuesta, la idea es crear una subclase de la UISegmentedControl, y reemplazar 2 métodos para tanto el estilo como el estado inicial, así como la captura el evento de cambio de estilo de ella automáticamente cuando el usuario selecciona los diferentes segmentos.

    - (void)layoutSubviews {
    [super layoutSubviews];
    [self updateSegmentColors];
    }
    -(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    [self updateSegmentColors];
    }
    - (void)updateSegmentColors {
    NSArray* segments = [self.subviews sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
    //UISegmentedControl segments use UISegment objects (private API). But we can safely cast them to UIView objects.
    float v1 = ((UIView *)obj1).frame.origin.x;
    float v2 = ((UIView *)obj2).frame.origin.x;
    if (v1 < v2) return NSOrderedAscending;
    else if (v1 > v2) return NSOrderedDescending;
    else return NSOrderedSame;
    }];
    for (int i=0; i<segments.count; i++) {
    if (i == self.selectedSegmentIndex) {
    [segments[i] setTintColor:[UIColor redColor]];
    } else {
    [segments[i] setTintColor:[UIColor grayColor]];
    }
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here