Change UIButton border color on highlight

后端 未结 6 787
礼貌的吻别
礼貌的吻别 2021-02-03 23:53

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

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

However, I want to change the .b

相关标签:
6条回答
  • 2021-02-04 00:29

    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
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-04 00:31

    You can override setHighlighted and setSelected methods in UIButton subclass. From there you just tweak border color like following:

    - (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];
        }
    }
    
    0 讨论(0)
  • 2021-02-04 00:39

    Self contained solution:

    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
    

    Thanks to @josip-b!

    0 讨论(0)
  • 2021-02-04 00:45

    For a solution that doesn't involve subclassing, you could always add an extension method to UIButton. E.g.

    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)
    }
    
    0 讨论(0)
  • 2021-02-04 00:47

    Swift 4 :

    override var isHighlighted: Bool {
        didSet {
            layer.borderColor = isHighlighted ? UIColor.lightGray.cgColor : UIColor.black.cgColor
        }
    }
    
    0 讨论(0)
  • 2021-02-04 00:50

    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
    };
    
    0 讨论(0)
提交回复
热议问题