iphone objective-c ios uibutton border-color

iphone - Cambiar el color del borde UIButton en resalte



objective-c ios (5)

Para una solución que no involucra subclases, siempre puede agregar un método de extensión a UIButton. P.ej

func setBackgroundColor(_ backgroundColor: UIColor, borderColor: UIColor, borderWidth: CGFloat, cornerRadius: CGFloat, forState state: UIControlState) { UIGraphicsBeginImageContext(CGSize(width: bounds.size.width, height: bounds.size.height)) guard let context = UIGraphicsGetCurrentContext() else { return } if borderWidth > 0 { layer.borderWidth = 0 // hide the layer''s border if we''re going to draw a border } context.addPath(UIBezierPath(roundedRect: bounds.insetBy(dx: borderWidth, dy: borderWidth), cornerRadius: cornerRadius).cgPath) context.setStrokeColor(borderColor.cgColor) context.setFillColor(backgroundColor.cgColor) context.setLineWidth(borderWidth) context.closePath() context.strokePath() context.fillPath() let buttonImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() setBackgroundImage(buttonImage, for: state) }

Tengo un UIButton personalizado simple, al cual agregué:

button.layer.bordercolor = [[UIColor blueColor]CGColor];

Sin embargo, quiero cambiar el .bordercolor cuando el botón está resaltado. Traté de agregar una acción a la acción de tocar el botón que cambia el color del borde a rojo, pero cuando el usuario levanta el dedo, permanece rojo en lugar de volver al azul. ¿Algunas ideas?


Estabas en el camino correcto. Verifique el código a continuación, amplía esto, pero lo que querrá hacer es vincular selectores a diferentes eventos de control en su botón. Uno para touchDown para cambiar la sombra a rojo, y otro para touchUpInside para cambiar la sombra hacia atrás cuando levanta el dedo.

Además, veo que has hecho varias preguntas sobre y aún no has marcado ninguna como la respuesta correcta. Para continuar recibiendo ayuda en este sitio web, deberá comenzar a marcar las respuestas correctas a sus preguntas.

[myButton addTarget:self action:@selector(highlightBorder) forControlEvents:UIControlEventTouchDown]; [myButton addTarget:self action:@selector(unhighlightBorder) forControlEvents:UIControlEventTouchUpInside]; - (void)highlightBorder { myButton.layer.borderColor = [[UIColor redColor]CGColor]; } - (void)unhighlightBorder { myButton.layer.borderColor = [[UIColor blueColor]CGColor]; //additional code for an action when the button is released can go here. }

NOTA: Otras opciones para UIControlEvents incluyen:

enum { UIControlEventTouchDown = 1 << 0, UIControlEventTouchDownRepeat = 1 << 1, UIControlEventTouchDragInside = 1 << 2, UIControlEventTouchDragOutside = 1 << 3, UIControlEventTouchDragEnter = 1 << 4, UIControlEventTouchDragExit = 1 << 5, UIControlEventTouchUpInside = 1 << 6, UIControlEventTouchUpOutside = 1 << 7, UIControlEventTouchCancel = 1 << 8, UIControlEventValueChanged = 1 << 12, UIControlEventEditingDidBegin = 1 << 16, UIControlEventEditingChanged = 1 << 17, UIControlEventEditingDidEnd = 1 << 18, UIControlEventEditingDidEndOnExit = 1 << 19, UIControlEventAllTouchEvents = 0x00000FFF, UIControlEventAllEditingEvents = 0x000F0000, UIControlEventApplicationReserved = 0x0F000000, UIControlEventSystemReserved = 0xF0000000, UIControlEventAllEvents = 0xFFFFFFFF };


Puede anular los métodos setHighlighted y setSelected en la subclase UIButton. A partir de ahí, simplemente modifica el color del borde de la siguiente manera:

- (void)setHighlighted:(BOOL)highlighted { [super setHighlighted:highlighted]; [self tweakState:highlighted]; } - (void)setSelected:(BOOL)selected { [super setSelected:selected]; [self tweakState:selected]; } - (void)tweakState:(BOOL)state { if (state) { self.layer.borderColor = [_highlightedBorderColor CGColor]; } else { self.layer.borderColor = [_defaultBorderColor CGColor]; } }


Solución autónoma:

static UIColor *BorderColor() { return [UIColor grayColor]; } static UIColor *HighlightedBorderColor() { return [UIColor lightGrayColor]; } @interface BorderedButton : UIButton @end @implementation BorderedButton - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.layer.borderColor = BorderColor().CGColor; self.layer.cornerRadius = 4.0; self.layer.borderWidth = 1.0; } return self; } - (void)setHighlighted:(BOOL)highlighted { [super setHighlighted:highlighted]; self.layer.borderColor = (highlighted) ? HighlightedBorderColor().CGColor : BorderColor().CGColor; } @end

Gracias a @ josip-b!


La respuesta de SWIFT 2.x a su problema:

➜ Simplemente anule la propiedad resaltada con el observador "didSet".

override var highlighted: Bool { didSet { switch highlighted { case true: layer.borderColor = UIColor.lightGrayColor().CGColor case false: layer.borderColor = UIColor.blackColor().CGColor } } }

Swift 3:

override var isHighlighted: Bool { didSet { switch isHighlighted { case true: layer.borderColor = UIColor.lightGray.cgColor case false: layer.borderColor = UIColor.black.cgColor } } }