titlelabel guidelines color buttons iphone uibutton

iphone - guidelines - Cambiar el color de fondo de UIButton cuando se resalta



menu ios (6)

Hola, quiero cambiar el color de fondo de UIButton que el usuario toca en el botón.

Estoy mostrando color de fondo usando degradado, cuando el usuario toca para cambiar el color del degradado.

[btn setTitle: @"Next" forState:UIControlStateNormal]; CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = btn.bounds; gradient.cornerRadius = 10.0f; locations = [[NSArray alloc] initWithObjects: 0.0f, 0.0f, 0.0f,0.0f, nil]; [gradient setLocations:locations]; colorNext = [[NSArray alloc] initWithObjects:…., nil]; gradient.colors = colorNext; [locations release]; [btn.layer insertSublayer:gradient atIndex:0]; btn.titleLabel.textColor = [UIColor blackColor];


Cuando configuras el TintColor del botón, funciona cuando está resaltado

[YourButton setTintColor:[UIColor color]];


Encontré este AYUIButton en GitHub y funciona perfectamente :) Aquí está el código de ejemplo:

[btn setBackgroundColor:[UIColor redColor] forState:UIControlStateNormal]; [btn setBackgroundColor:[UIColor blueColor] forState:UIControlStateHighlighted];


No se recomienda cambiar la jerarquía de capa interna de un UIButton, ya que puede interrumpirse en una futura actualización del iOS. Además, puede hacer que Apple rechace su solicitud. Una mejor solución sería crear una subclase de botón. Aquí hay un ejemplo de cómo hacerlo:

@interface MyButton : UIButton @end @implementation MyButton - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self addObserver:self forKeyPath:@"highlighted" options:NSKeyValueObservingOptionNew context:NULL]; } return self; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { [self setNeedsDisplay]; } - (void)drawRect:(CGRect)rect { [super drawRect:rect]; if (self.highlighted == YES) { CGContextRef ctx = UIGraphicsGetCurrentContext(); CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB(); const CGFloat *topGradientColorComponents = CGColorGetComponents([UIColor whiteColor].CGColor); const CGFloat *bottomGradientColorComponents = CGColorGetComponents([UIColor blackColor].CGColor); CGFloat colors[] = { topGradientColorComponents[0], topGradientColorComponents[1], topGradientColorComponents[2], topGradientColorComponents[3], bottomGradientColorComponents[0], bottomGradientColorComponents[1], bottomGradientColorComponents[2], bottomGradientColorComponents[3] }; CGGradientRef gradient = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors) / (sizeof(colors[0]) * 4)); CGColorSpaceRelease(rgb); CGContextDrawLinearGradient(ctx, gradient, CGPointMake(0, 0), CGPointMake(0, self.bounds.size.height), 0); CGGradientRelease(gradient); } else { // Do custom drawing for normal state } } - (void)dealloc { [self removeObserver:self forKeyPath:@"highlighted"]; [super dealloc]; } @end

Puede que tenga que modificarlo un poco para que haga lo que quiera, pero creo que se le ocurre la idea básica.


Prueba esto:

[Button addTarget:self action:@selector(doSomething:) forControlEvents:UIControlEventTouchUpInside]; [Button addTarget:self action:@selector(setBgColorForButton:) forControlEvents:UIControlEventTouchDown]; [Button addTarget:self action:@selector(clearBgColorForButton:) forControlEvents:UIControlEventTouchDragExit]; -(void)setBgColorForButton:(UIButton*)sender { [sender setBackgroundColor:[UIColor blackColor]]; } -(void)clearBgColorForButton:(UIButton*)sender { [sender setBackgroundColor:[UIColor redColor]]; } -(void)doSomething:(UIButton*)sender { double delayInSeconds = 0.3; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [sender setBackgroundColor:[UIColor redColor]]; }); //do something }


Puede usar este método para crear un UIImage sólido de color específico y luego aplicarlo a su botón. He hecho una categoría para UIImage para hacer esto.

+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size { UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, color.CGColor); CGContextFillRect(context, (CGRect){.size = size}); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } + (UIImage *)imageWithColor:(UIColor *)color { return [UIImage imageWithColor:color size:CGSizeMake(1, 1)]; }

Uso:

[button setBackgroundImage:[UIImage imageWithColor:[UIColor redColor]] forState:UIControlStateNormal];

Como señaló Matthias , puede usar con seguridad la imagen 1x1 para el fondo de su botón, se estirará para llenar el botón.


Rápido

Extensión para UIButton que le permite especificar el color de fondo para cada estado:

https://github.com/acani/UIButtonBackgroundColor

Tenga en cuenta que para el iPhone 6 plus debe cambiar lo siguiente, dentro de la extensión en la clase .swift, que lo solucionará para todas las versiones:

//let rect = CGRect(x: 0, y: 0, width: 0.5, height: 0.5) comment this line let rect = CGRect(x: 0, y: 0, width: 1, height: 1)