내 앱의 어느 시점에서 강조 표시되어 있습니다. UIButton
(예 : 사용자가 버튼에 손가락을 가지고있을 때) 버튼이 강조 표시되어있는 동안 배경색을 변경해야합니다 (그래서 사용자의 손가락이 여전히 버튼에있는 동안) .
나는 다음을 시도했다.
_button.backgroundColor = [UIColor redColor];
그러나 작동하지 않습니다. 색상은 동일하게 유지됩니다. 버튼이 강조 표시되지 않고 잘 작동하면 동일한 코드를 시도했습니다. 또한 -setNeedsDisplay
색상을 변경 한 후 전화 를 시도했지만 아무런 효과가 없었습니다.
버튼을 강제로 배경색을 변경하는 방법은 무엇입니까?
답변
UIButton
의 setHighlighted
메소드를 재정 의 할 수 있습니다 .
목표 -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)
}
}