Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change UIButton border color on highlight

I've got a simple custom UIButton, to which I added:

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

However, I want to change the .bordercolor when the button is highlighted. I tried adding an action to the button's touchDown action that changes the .bordercolor to red, but when the user lifts their finger, it stays red rather than returning to blue. Any ideas?

like image 715
JohnWickham Avatar asked Aug 12 '12 23:08

JohnWickham


2 Answers

You were on the right track. Check the code below, it elaborates on this, but what you'll want to do is link selectors to different control events on your button. One for touchDown to change the shadow to red, and another for touchUpInside to change the shadow back when you lift your finger.

Additionally, I see you've asked several questions on Stack Overflow and have yet to mark any as the correct answer. To continue to receive help on this website, you will need to start marking correct answers to your questions.

[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. } 

NOTE: Other options for UIControlEvents include:

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 }; 
like image 171
Mick MacCallum Avatar answered Oct 03 '22 06:10

Mick MacCallum


The SWIFT 2.x answer to your problem:

➜ Just override the highlighted property with "didSet" observer.

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         }     } } 
like image 31
user3378170 Avatar answered Oct 03 '22 07:10

user3378170