[ios] 강조 표시된 상태에서 UIButton의 배경색을 변경하는 방법은 무엇입니까?

내 앱의 어느 시점에서 강조 표시되어 있습니다. UIButton (예 : 사용자가 버튼에 손가락을 가지고있을 때) 버튼이 강조 표시되어있는 동안 배경색을 변경해야합니다 (그래서 사용자의 손가락이 여전히 버튼에있는 동안) .

나는 다음을 시도했다.

_button.backgroundColor = [UIColor redColor];

그러나 작동하지 않습니다. 색상은 동일하게 유지됩니다. 버튼이 강조 표시되지 않고 잘 작동하면 동일한 코드를 시도했습니다. 또한 -setNeedsDisplay색상을 변경 한 후 전화 를 시도했지만 아무런 효과가 없었습니다.

버튼을 강제로 배경색을 변경하는 방법은 무엇입니까?



답변

UIButtonsetHighlighted메소드를 재정 의 할 수 있습니다 .

목표 -C

- (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];

    if (highlighted) {
        self.backgroundColor = UIColorFromRGB(0x387038);
    } else {
        self.backgroundColor = UIColorFromRGB(0x5bb75b);
    }
}

스위프트 3.0 및 스위프트 4.1

override open var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? UIColor.black : UIColor.white
    }
}


답변

이런 종류의 문제가 당신이 겪고있는 것을 해결하거나 일반적인 개발 환경에 맞는지 확실하지 않지만 touchDown 이벤트에서 버튼의 배경색을 변경하는 것이 가장 먼저 시도합니다.

옵션 1:

캡처하려면 두 가지 이벤트가 필요합니다. UIControlEventTouchDown은 사용자가 버튼을 누를 때 사용됩니다. UIControlEventTouchUpInside 및 UIControlEventTouchUpOutside는 버튼을 놓아 정상 상태로 되돌릴 때 사용됩니다.

UIButton *myButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setFrame:CGRectMake(10.0f, 10.0f, 100.0f, 20.f)];
[myButton setBackgroundColor:[UIColor blueColor]];
[myButton setTitle:@"click me:" forState:UIControlStateNormal];
[myButton setTitle:@"changed" forState:UIControlStateHighlighted];
[myButton addTarget:self action:@selector(buttonHighlight:) forControlEvents:UIControlEventTouchDown];
[myButton addTarget:self action:@selector(buttonNormal:) forControlEvents:UIControlEventTouchUpInside];

옵션 2 :

원하는 강조 색상으로 만든 이미지를 반환합니다. 이것은 카테고리 일 수도 있습니다.

+ (UIImage *)imageWithColor:(UIColor *)color {
   CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
   UIGraphicsBeginImageContext(rect.size);
   CGContextRef context = UIGraphicsGetCurrentContext();

   CGContextSetFillColorWithColor(context, [color CGColor]);
   CGContextFillRect(context, rect);

   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return image;
}

그런 다음 버튼의 강조 표시된 상태를 변경하십시오.

[myButton setBackgroundImage:[self imageWithColor:[UIColor greenColor]] forState:UIControlStateHighlighted];


답변

highlighted계산 된 속성 으로 재정의 할 필요가 없습니다 . 속성 관찰자를 사용하여 배경색 변경을 트리거 할 수 있습니다.

override var highlighted: Bool {
    didSet {
        backgroundColor = highlighted ? UIColor.lightGrayColor() : UIColor.whiteColor()
    }
}

스위프트 4

override open var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? UIColor.lightGray : UIColor.white
    }
}


답변

Swift의 편리한 일반 확장 :

extension UIButton {
    private func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }

    func setBackgroundColor(color: UIColor, forUIControlState state: UIControlState) {
        self.setBackgroundImage(imageWithColor(color), forState: state)
    }
}

스위프트 3.0

extension UIButton {
    private func imageWithColor(color: UIColor) -> UIImage? {
        let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        context?.setFillColor(color.cgColor)
        context?.fill(rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }

    func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
        self.setBackgroundImage(imageWithColor(color: color), for: state)
    }
}


답변

Swift에서는 setHighlighted 메서드를 재정의하는 대신 강조 표시된 (또는 선택한) 속성의 접근자를 재정의 할 수 있습니다.

override var highlighted: Bool {
        get {
            return super.highlighted
        }
        set {
            if newValue {
                backgroundColor = UIColor.blackColor()
            }
            else {
                backgroundColor = UIColor.whiteColor()
            }
            super.highlighted = newValue
        }
    }


답변

강조 표시된 변수를 재정의합니다. 추가 @IBInspectable하면 스토리 보드에서 강조 표시된 배경색을 편집 할 수 있습니다.

class BackgroundHighlightedButton: UIButton {
    @IBInspectable var highlightedBackgroundColor :UIColor?
    @IBInspectable var nonHighlightedBackgroundColor :UIColor?
    override var highlighted :Bool {
        get {
            return super.highlighted
        }
        set {
            if newValue {
                self.backgroundColor = highlightedBackgroundColor
            }
            else {
                self.backgroundColor = nonHighlightedBackgroundColor
            }
            super.highlighted = newValue
        }
    }
}


답변

보다 컴팩트 한 솔루션 ( @ aleksejs-mjaliks 기반) 답변 ) :

스위프트 3 / 4 + :

override var isHighlighted: Bool {
    didSet {
        backgroundColor = isHighlighted ? .lightGray : .white
    }
}

스위프트 2 :

override var highlighted: Bool {
    didSet {
        backgroundColor = highlighted ? UIColor.lightGrayColor() : UIColor.whiteColor()
    }
}

무시하고 싶지 않다면 이것은 @ timur-bernikowich 의 답변 ( Swift 4.2 ) 의 업데이트 버전입니다 .

extension UIButton {
  func setBackgroundColor(_ color: UIColor, forState controlState: UIControl.State) {
    let colorImage = UIGraphicsImageRenderer(size: CGSize(width: 1, height: 1)).image { _ in
      color.setFill()
      UIBezierPath(rect: CGRect(x: 0, y: 0, width: 1, height: 1)).fill()
    }
    setBackgroundImage(colorImage, for: controlState)
  }
}