Este me tiene perplejo.

Es posible en absoluto para cambiar el color de fondo de un UIButton en Cacao para el iPhone.
He intentado configurar el color de fondo, pero sólo a los cambios en las esquinas. setBackgroundColor: parece ser el único método disponible para este tipo de cosas.

[random setBackgroundColor:[UIColor blueColor]];
[random.titleLabel setBackgroundColor:[UIColor blueColor]];

InformationsquelleAutor dubbeat | 2010-05-11

16 Comentarios

  1. 159

    Esto se puede hacer mediante programación de hacer una réplica:

    loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [loginButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    loginButton.backgroundColor = [UIColor whiteColor];
    loginButton.layer.borderColor = [UIColor blackColor].CGColor;
    loginButton.layer.borderWidth = 0.5f;
    loginButton.layer.cornerRadius = 10.0f;

    edit: por supuesto, usted tendría que #import <QuartzCore/QuartzCore.h>

    edit: a todos los nuevos lectores, usted debe también considerar algunas opciones añadidas como «otra posibilidad». para que usted considere.

    Ya que esta es una respuesta anterior, te recomiendo leer los comentarios para la solución de problemas

    • he probado tu código, pero no funcionó para mí
    • no funciona, o no se obtendrá el resultado esperado?
    • Mejor respuesta todavía cuarzo FTW
    • Esto es lo que el OP está buscando.
    • dulce! De todos los solns me encontré con esta es con la que me fui con el. Como punto de aclaración, haciendo una ‘réplica’ significa el uso de Cuarzo para dibujar un rectángulo redondeado en un botón personalizado, en lugar de utilizar un RoundedRect de tipo botón. Al principio pensé que significaba de alguna manera hacer un duplicado de un redondeado rect con un color diferente para simular cambiar el color de fondo.
    • Funcionó a la perfección, la mejor respuesta a la OP. Gracias por compartir.
    • Esta respuesta es tan popular que debe tener el mérito que me falta. ¿Cómo se puede cambiar el color de fondo de acuerdo con el estado? Presumiblemente uno debe explícitamente cambiar el color de fondo cada vez que los cambios de estado. Mi botón está deshabilitado en la prensa, hasta un servicio web responde. Debo cambiar para resaltar el color en la prensa y tiene un temporizador de cambio para discapacitados color mientras se espera para el ws para responder? Si me falta el punto por favor alguien puede explicar. Gracias Polly.
    • FYI para que otros tomen nota de UIButtonTypeCustom, este no trabajo en el estilo por defecto de los botones.
    • No es necesario ser actualizado? El fragmento publicado no hace que los botones de fondo de los contenidos a ser de cualquier color (sólo los bordes).
    • lo siento por no contestar en un largo tiempo; Polly: tienes que hacer algo de diseño personalizado aquí, pero este es el esquema que se puede utilizar. para concretos de casos de uso, usted debe experimentar y ver qué funciona mejor imo. @AlvinfromDiaspar: puedes cambiar el «whitecolor» con el color que usted desee. El uso de RGB para crear el color que usted desea si no estándar. espero que esto ayude.
    • También se debe establecer como UIButtonTypeCustom en el archivo xib. Cambiar mediante programación no parece funcionar. Por favor actualizar el post si es posible ya que estos comentarios no son muy visibles.
    • Yo no conseguir el resultado esperado, como la imagen de fondo va de verde y, al instante, se mantiene el color original. ¿Cómo puedo cambiar permanentemente el color y eliminar solo cuando yo quiera? Gracias
    • Lo siento, no vi tu comentario antes, pero si usted todavía está interesado aquí es lo que acabé haciendo: subclase UIButton y reemplazar drawRect: para dibujar la parte redondeada de la rect el uso de algunos UIBezierPaths. Después de dibujar, rellenar con un degradado mediante CGGradientCreateWithColorComponents(). Uno de los argumentos para esta función es una de las 4 elemento de la matriz de carrozas (correspondiente a R, G, B, & alfa). Yo defn ed 2 color matrices, una para cada estado, y eligió el apropiado en drawRect basado en el estado del botón.
    • La cosa importante a tener en cuenta es que la capa.borderColor toma un CGColor, no UIColor! Por lo tanto, no se puede agregar como una propiedad dinámica de la identidad inspector – a diferencia de la capa.cornerRadius y capa.borderWidth
    • .backgroundColor era todo lo que necesitaba

  2. 59

    Tengo un enfoque diferente,

    [btFind setTitle:NSLocalizedString(@"Find", @"") forState:UIControlStateNormal];    
    [btFind setBackgroundImage:[CommonUIUtility imageFromColor:[UIColor cyanColor]] 
            forState:UIControlStateNormal];
    btFind.layer.cornerRadius = 8.0;
    btFind.layer.masksToBounds = YES;
    btFind.layer.borderColor = [UIColor lightGrayColor].CGColor;
    btFind.layer.borderWidth = 1;

    De CommonUIUtility,

    + (UIImage *) imageFromColor:(UIColor *)color {
        CGRect rect = CGRectMake(0, 0, 1, 1);
        UIGraphicsBeginImageContext(rect.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetFillColorWithColor(context, [color CGColor]);
        // [[UIColor colorWithRed:222./255 green:227./255 blue: 229./255 alpha:1] CGColor]) ;
        CGContextFillRect(context, rect);
        UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return img;
    }

    No olvides #import <QuartzCore/QuartzCore.h>

    • Uno agradable. Me di cuenta de que había que añadir un btFind.layer.borderWidth = 1;
    • Me gusta esta solución, pero por el momento no los puedo usar. Me sale un error, porque «CommonUIUtility» no puede ser encontrado. Google solo me da eclipse cosas, pero supongo que debe estar en la QuartzCore? Alguna idea?
    • No, esa es una clase definida por el usuario para hacer de interfaz de usuario comunes mete en la aplicación. Escribir el imageFromColor método propio de la clase.
    • Cripes, que fue más difícil de lo que debería haber sido. Gracias por una gran solución.
    • Huele como una categoría de método en UIButton: setBackgroundColor:(UIColor *) forState:(UIControlState).
    • Es tan tonto que estamos en iOS 7 y esto es TODAVÍA la forma más limpia para añadir un color de fondo

  3. 32

    Supongo que estamos hablando de un UIButton con UIButtonTypeRoundedRect?
    No se puede cambiar el color de fondo de la. Cuando intenta cambiar el color de fondo que usted está en lugar de cambiar el color de la rect el botón que está dibujado en (que es generalmente claro).
    Así que hay dos maneras de ir. Ya sea que usted subclase UIButton y sobrescribir sus -drawRect: método o crear imágenes para los diferentes estados del botón (que está perfectamente bien para hacer).

    Si establece las imágenes de fondo en Interface Builder, usted debe notar que el IB no admite la configuración de imágenes para todos los estados del botón puede tener, así que recomendamos que ajuste las imágenes en el código como este:

    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [myButton setBackgroundImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
    [myButton setBackgroundImage:[UIImage imageNamed:@"disabled.png"] forState:UIControlStateDisabled];
    [myButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected];
    [myButton setBackgroundImage:[UIImage imageNamed:@"higligted.png"] forState:UIControlStateHighlighted];
    [myButton setBackgroundImage:[UIImage imageNamed:@"highlighted+selected.png"] forState:(UIControlStateHighlighted | UIControlStateSelected)];

    La última línea muestra cómo establecer una imagen para el seleccionado & destacó estado (que es el que IB no se puede establecer).
    Usted no necesita las imágenes seleccionadas (línea 4 & 6) si estás botón dosn no necesita un estado seleccionado.

    • Gracias por la explicación. Sólo una pregunta rápida. Si estoy sobreescribiendo el método drawrect supongo que me implican el uso de un dibujo de la biblioteca? Algo solo las líneas de programación de dibujo de un rectángulo redondeado y rellenar con un color?
    • Acabo de hacer un corto de google de consulta para «iphone drawrect la vuelta a la esquina» y encontré este: iphonedevelopment.blogspot.com/2008/11/… Compruebe el método drawrect para un ejemplo de cómo dibujar una ronda rect. Usted puede utilizar CGContextSetFillColorWithColor y CGContextFillPath para llenar el camino señalado por CGContextAddArcToPoint.
    • Eso es genial. Muchas gracias
    • +50 por señalar la bitmasking potencial para el control de los estados, es decir: forState:(UIControlStateHighlighted | UIControlStateSelected) Saludos.
  4. 28

    Otra posibilidad:

    1. Crear un UIButton en el Interface builder.
    2. Darle un tipo de ‘Custom’
    3. Ahora, en IB es posible cambiar el color de fondo

    Sin embargo, el botón cuadrado, y eso no es lo que queremos. Crear un IBOutlet con una referencia a este botón y agregue lo siguiente en el método viewDidLoad:

    [buttonOutlet.layer setCornerRadius:7.0f];
    [buttonOutlet.layer setClipToBounds:YES];

    No te olvides de importación QuartzCore.h

    • Perfecto, gracias! No estoy seguro de si es por la versión de iOS que estoy usando (5.1) pero setClipToBounds no estaba disponible. En lugar de eso utiliza buttonOutlet.la capa.masksToBounds = TRUE;
    • Al añadir este código, se muestra una redondeado rect, pero cuando hago clic en él, el botón no invertir resaltar. ¿Qué está pasando?
    • El problema con este enfoque es que no se puede establecer un color de fondo para el resaltado estado del botón.
  5. 17

    Subclase UIButton y reemplazar setHighlighted y setSelected métodos

    -(void) setHighlighted:(BOOL)highlighted {
    
      if(highlighted) {
        self.backgroundColor = [self.mainColor darkerShade];
      } else {
        self.backgroundColor = self.mainColor;
      }
      [super setHighlighted:highlighted];
    }
    
    -(void) setSelected:(BOOL)selected {
    
      if(selected) {
        self.backgroundColor = [self.mainColor darkerShade];
      } else {
        self.backgroundColor = self.mainColor;
      }
      [super setSelected:selected];
    }

    Mi darkerShade método es en un UIColor categoría como esta

    -(UIColor*) darkerShade {
    
      float red, green, blue, alpha;
      [self getRed:&red green:&green blue:&blue alpha:&alpha];
    
      double multiplier = 0.8f;
      return [UIColor colorWithRed:red * multiplier green:green * multiplier blue:blue*multiplier alpha:alpha];
    }
  6. 7

    Es posible el cambio de un UIButtons color de fondo?

    Si no quieren usar imágenes, y quiere que se vea exactamente igual que la parte Redondeada de la Rect estilo, prueba este. Sólo tiene que colocar una UIView sobre el UIButton, con un idéntico marco y el cambio de tamaño automático de la máscara, configurar el alfa y el 0,3, y establecer el fondo a un color. A continuación, utilice el siguiente fragmento de recortar los bordes redondeados fuera el color de superposición de vista. También, desactive la casilla de ‘la Interacción del Usuario Habilitada la casilla de verificación’ in IB en el UIView para permitir eventos de toque para conectar en cascada hasta el UIButton debajo.

    Un efecto secundario es que tu texto también se coloreada.

    #import <QuartzCore/QuartzCore.h>
    
    colorizeOverlayView.layer.cornerRadius = 10.0f;
    colorizeOverlayView.layer.masksToBounds = YES;
  7. 7

    Otra posibilidad (la mejor y más bella en mi humilde opinión):

    Crear un UISegmentedControl con 2 segmentos en el color de fondo en el Interface Builder. Establecer el tipo «bar». Luego, cambiar a un único segmento. Interface builder no acepta un segmento así que tiene que hacerlo mediante programación.

    Por lo tanto, crear un IBOutlet para este botón y agregue esto a la viewDidLoad de la vista:

    [segmentedButton removeSegmentAtIndex:1 animated:NO];

    Ahora tienes un hermoso brillante, de color botón de la que se especifica el color de fondo.
    Para las acciones, utilizar el «valor cambiado’ evento.

    (He encontrado esto en http://chris-software.com/index.php/2009/05/13/creating-a-nice-glass-buttons/). Gracias Chris!

  8. 5

    Bueno, yo estoy 99% seguro de que usted no puede simplemente ir y cambiar el color de fondo de un UIButton. En su lugar tienes que ir y cambiar las imágenes de fondo que creo que es un dolor. Estoy asombrado de que yo tenía que hacer esto.

    Si estoy equivocado o si hay una mejor manera sin tener que poner imágenes de fondo, por favor hágamelo saber

    [random setBackgroundImage:[UIImage imageNamed:@"toggleoff.png"] forState:UIControlStateNormal];
        [random setTitleColor:[UIColor darkTextColor] forState:UIControlStateNormal];
    
    
    [random setBackgroundImage:[UIImage imageNamed:@"toggleon.png"] forState:UIControlStateNormal];
        [random setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    • Tienes toda la razón. Es un dolor, y algo que debería tomar unos minutos para hacer en lugar de la molestia de crear imágenes. Además, si el botón es redondo, que hace que sea aún más difícil de hacer así… Tal dolor.
  9. 2

    Por @EthanB sugerencia y @karim hacer una copia rectángulo lleno, he creado una categoría para el UIButton para lograr esto.

    Simplemente caer en el código de la Categoría: https://github.com/zmonteca/UIButton-PLColor

    Uso:

    [button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

    Opcional forStates a utilizar:

    UIControlStateNormal
    UIControlStateHighlighted
    UIControlStateDisabled
    UIControlStateSelected
  10. 2

    También puede agregar un CALayer en el botón, usted puede hacer un montón de cosas con estas incluyendo una superposición de color, en este ejemplo se utiliza un plano de la capa de color también se pueden graduar el color. Tenga en cuenta sin embargo añadido capas oscuras debajo de los

    +(void)makeButtonColored:(UIButton*)button color1:(UIColor*) color
    {
    
        CALayer *layer = button.layer;
        layer.cornerRadius = 8.0f;
        layer.masksToBounds = YES;
        layer.borderWidth = 4.0f;
        layer.opacity = .3;//
        layer.borderColor = [UIColor colorWithWhite:0.4f alpha:0.2f].CGColor;
    
        CAGradientLayer *colorLayer = [CAGradientLayer layer];
        colorLayer.cornerRadius = 8.0f;
        colorLayer.frame = button.layer.bounds;
        //set gradient colors
        colorLayer.colors = [NSArray arrayWithObjects:
                             (id) color.CGColor,
                             (id) color.CGColor,
                             nil];
    
        //set gradient locations
        colorLayer.locations = [NSArray arrayWithObjects:
                                [NSNumber numberWithFloat:0.0f],
                                [NSNumber numberWithFloat:1.0f],
                                nil];
    
    
        [button.layer addSublayer:colorLayer];
    
    }
    • Genial!!!!!! Pero no podía ser llamado varias veces contra el mismo botón. Podría, pero se añaden nuevas capas de nuevo y de nuevo.
    • Edita el código debe ser sugerido por un comentario (o, en su caso, por su propia respuesta).
  11. 1

    agregar un segundo objetivo para el UIButton para UIControlEventTouched y cambiar el UIButton color de fondo. Luego cambiar de nuevo en el UIControlEventTouchUpInside de destino;

  12. 1

    Esto no es tan elegante como sub-classing UIButton, sin embargo, si usted sólo quiere algo rápido de lo que yo hice fue crear botón personalizado, a continuación, un 1×1 píxel de la imagen con el color que me gustaría el botón a, y el de fondo del botón para que la imagen resaltado estado – funciona para mis necesidades.

  13. 1

    Yo sé que esto fue pedido hace mucho tiempo y ahora hay un nuevo UIButtonTypeSystem. Pero las preguntas son marcados como duplicados de esta pregunta, así que aquí está mi más reciente respuesta en el contexto de un iOS 7 sistema de botón, utilice el .tintColor de la propiedad.

    let button = UIButton(type: .System)
    button.setTitle("My Button", forState: .Normal)
    button.tintColor = .redColor()
  14. 0

    [myButton setBackgroundColor:[UIColor blueColor]];
    [myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

    Es posible cambiar esta forma o en el Storyboard y el cambio de fondo en las opciones en el lado derecho.

  15. 0

    Swift 3:

            static func imageFromColor(color: UIColor, width: CGFloat, height: CGFloat) -> UIImage {
                let rect = CGRect(x: 0, y: 0, width: width, height: height)
                UIGraphicsBeginImageContext(rect.size)
                let context = UIGraphicsGetCurrentContext()!
                context.setFillColor(color.cgColor)
                context.fill(rect)
                let img = UIGraphicsGetImageFromCurrentImageContext()!
                UIGraphicsEndImageContext()
                return img
            }
    
            let button = UIButton(type: .system)
            let image = imageFromColor(color: .red, width: 
            button.frame.size.width, height: button.frame.size.height)
            button.setBackgroundImage(image, for: .normal)
    • Esto sería mucho más útil respuesta si te dice cómo invocar o hacer uso del código que has puesto ahí arriba. Entra en un UIButton extensión?
    • agregó ejemplo de uso

Dejar respuesta

Please enter your comment!
Please enter your name here