追加したシンプルなカスタム UIButton があります。
button.layer.bordercolor = [[UIColor blueColor]CGColor];
ただし、ボタンが強調表示されているときに .bordercolor を変更したい。.bordercolor を赤に変更するアクションをボタンの touchDown アクションに追加しようとしましたが、ユーザーが指を離すと、青に戻るのではなく赤のままです。何か案は?
追加したシンプルなカスタム UIButton があります。
button.layer.bordercolor = [[UIColor blueColor]CGColor];
ただし、ボタンが強調表示されているときに .bordercolor を変更したい。.bordercolor を赤に変更するアクションをボタンの touchDown アクションに追加しようとしましたが、ユーザーが指を離すと、青に戻るのではなく赤のままです。何か案は?
あなたは正しい軌道に乗っていました。以下のコードを確認してください。これについて詳しく説明されていますが、やりたいことは、ボタンのさまざまなコントロール イベントにセレクターをリンクすることです。1 つtouchDown
は影を赤に変更するためのもので、もう 1 つはtouchUpInside
指を離したときに影を元に戻すためのものです。
さらに、Stack Overflow でいくつかの質問をされましたが、まだどれも正解としてマークされていません。この Web サイトで引き続きサポートを受けるには、質問に対する正しい回答をマークする必要があります。
[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
};
あなたの問題に対する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
}
}
}
スウィフト 3:
override var isHighlighted: Bool {
didSet {
switch isHighlighted {
case true:
layer.borderColor = UIColor.lightGray.cgColor
case false:
layer.borderColor = UIColor.black.cgColor
}
}
}
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];
}
}
自己完結型ソリューション:
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に感謝します!