wake-up-neo.com

Ändern Sie die Farbe des UIButton-Rahmens

Ich habe ein einfaches benutzerdefiniertes UIButton, das ich hinzugefügt habe:

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

Ich möchte jedoch die .bordercolor ändern, wenn die Schaltfläche hervorgehoben ist. Ich habe versucht, der touchDown-Aktion der Schaltfläche eine Aktion hinzuzufügen, durch die die .bordercolor-Farbe in rot geändert wird. Wenn der Benutzer jedoch den Finger anhebt, bleibt er rot und kehrt nicht zu blau zurück. Irgendwelche Ideen?

23
JohnWickham

Sie waren auf dem richtigen Weg. Überprüfen Sie den folgenden Code, der ausführlich erläutert wird, aber Sie möchten Auswahl-Selektoren mit verschiedenen Steuerereignissen auf Ihrer Schaltfläche verknüpfen. Eine für touchDown, um den Schatten in rot zu ändern, und eine andere für touchUpInside, um den Schatten wieder zu ändern, wenn Sie Ihren Finger anheben.

Außerdem sehe ich, dass Sie einige Fragen zum Stack Overflow gestellt haben und noch keine als die richtige Antwort markieren. Um weiterhin Hilfe auf dieser Website zu erhalten, müssen Sie die richtigen Antworten auf Ihre Fragen markieren.

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

HINWEIS: Andere Optionen für UIControlEvents enthalten:

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
};
40
Mick MacCallum

Die Swift 2.x Antwort auf Ihr Problem:

Over Überschreiben Sie die hervorgehobene Eigenschaft einfach mit "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
        }
    }
}
11
user3378170

Sie können setHighlighted- und setSelected-Methoden in der UIButton-Unterklasse überschreiben. Von dort aus kannst du die Rahmenfarbe wie folgt anpassen:

- (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];
    }
}
9
Josip B.

In sich geschlossene Lösung: 

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

Danke an @ josip-b!

2
Zorayr

Für eine Lösung ohne Unterklassifizierung können Sie UIButton immer eine Erweiterungsmethode hinzufügen. Z.B.

func setBackgroundColor(_ backgroundColor: UIColor,
                        borderColor: UIColor,
                        borderWidth: CGFloat,
                        cornerRadius: CGFloat,
                        forState state: UIControlState) {

    UIGraphicsBeginImageContext(bounds.size)
    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)
}
1
chrysAllwood

Swift 4 :

override var isHighlighted: Bool {
    didSet {
        layer.borderColor = isHighlighted ? UIColor.lightGray.cgColor : UIColor.black.cgColor
    }
}
0
fethica