突出显示UIButton边框颜色
我有一个简单的自定义UIButton,我补充说:
button.layer.bordercolor = [[UIColor blueColor]CGColor];
但是,我想在突出显示button时更改.bordercolor。 我尝试向button的touchDown动作添加一个动作,将.bordercolor更改为红色,但是当用户举起手指时,它将保持红色而不是返回蓝色。 有任何想法吗?
你在正确的轨道上。 检查下面的代码,它详细说明了这一点,但是你想要做的是将select器链接到button上的不同控制事件。 一个用于touchDown
将阴影更改为红色,另一个用于touchUpInside
在您抬起手指时更改阴影。
此外,我看到你已经问了Stack Overflow的几个问题,还没有把任何标记为正确的答案。 要继续在本网站获得帮助,您需要开始标记正确的答案。
[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. }
注意: UIControlEvents
其他选项包括:
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 };
你可以覆盖UIButton子类中的setHighlighted
和setSelected
方法。 从那里你只需调整边框颜色,如下所示:
- (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]; } }
SWIFT 2.x回答您的问题:
➜用“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 } } }
自包含解决scheme:
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
感谢@ josip-b!
对于不涉及子类化的解决scheme,您可以随时向UIButton添加扩展方法。 例如
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) }