비활성화 된 UIButton이 희미하거나 회색이 아닙니다


135

내 iPhone 앱에는 Interface Builder에서 만든 UIButton이 있습니다. 내 코드에서 이와 같이 성공적으로 활성화 및 비활성화 할 수 있습니다 ...

sendButton.enabled = YES;

또는

sendButton.enabled = NO;

그러나 버튼의 시각적 모양은 항상 동일합니다! 희미하거나 회색이 아닙니다. 그래도 클릭하면 예상대로 활성화 또는 비활성화됩니다. 뭔가 빠졌습니까? 희미 해 지거나 회색으로 보입니까?


UIButton으로 이미지를 사용하십니까?
할리 야

아닙니다. 알파를 설정해야합니다. 따라서 작동합니다.
Ravin

답변:


187

다음 코드를 사용할 수 있습니다.

sendButton.enabled = YES;
sendButton.alpha = 1.0;

or

sendButton.enabled = NO;
sendButton.alpha = 0.5;

12
이 작동하지만 내가 좋아하는 제어 상태에 따라 모양 변경 솔루션 기산 아래에서 훨씬 더 좋은 생각입니다. 상태에 따라 컨트롤의 모양을 명시 적으로 업데이트 할 필요없이 내장 된 메커니즘을 사용하여 자동 변경을 수행합니다.
Benjohn

78

상태 설정을 변경하여 비활성화하고 원하는 것을 선택하십시오. 비활성화 된 상태의 배경 이미지

여기에 이미지 설명을 입력하십시오


13
버튼 하위 제목의 속성 만 변경됩니다 . 배경색은 보기 하위 제목 아래 에 있으므로 상태 구성에 따라 변경되지 않습니다.
헌터 몽크

2
뷰의 배경색으로는 작동하지 않습니다. 내 프로젝트에서 나는 이전 답변과 이것을 결합했습니다.
Anton

40

또 다른 옵션은 비활성화 된 상태의 텍스트 색상 (예 : 밝은 회색)을 변경하는 것입니다.

스토리 보드 편집기 DisabledState Config팝업 버튼 에서 선택하십시오 . 사용 Text Color텍스트 색상을 변경하려면 팝업 버튼을 누릅니다.

코드에서 -setTitleColor:forState:메시지를 사용하십시오 .


이것은 알파 조정에 대한 예외적 인 대답보다 훨씬 더 나은 해결책 인 것 같습니다. 나는 이미 몇 달 전에 투표를했는데 이제는 같은 문제로 다시 돌아 왔습니다. 다시 할 수 있기를 바랍니다!
Benjohn

그렇습니다. 작동하는 솔루션 인 것 같습니다. 나는 단지 밝은 회색을 사용합니다.
atereshkov

23

버튼이 비활성화 된 상태를 생성하도록 ( UIControlStateDisabled회색 비활성화 된 이미지) 및 UIControlStateNormal(일반 이미지)에 대해 서로 다른 이미지를 설정하십시오 .


2
그는 이미지를 사용하지 않지만 같은 개념을에 적용 할 수 있습니다 [ UIButton setAttributedTitle:forState:]. 텍스트 전경색이 투명한 색으로 설정되어있는 문자열을 만듭니다.
nielsbot

20

비활성화했을 때 버튼이 희미 해 지도록 알파를 설정할 수 있습니다. 두 가지 옵션이 있습니다.

첫 번째 방법 : 앱의 모든 버튼을 적용하려면 extension다음과 같이 UIButton을 작성할 수 있습니다 .

extension UIButton {

    open override var isEnabled: Bool{
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }

}

두 번째 방법 : 앱의 일부 버튼을 적용하려면 아래처럼 UIButton에서 사용자 정의 클래스를 작성하고 적용하려는이 클래스를 사용할 수 있습니다.

class MyButton: UIButton {
    override var isEnabled: Bool {
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }
}

13

텍스트 버튼을 사용하면 viewDidLoad 인스턴스 메소드에 넣을 수 있습니다

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state

예:

[self.syncImagesButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];

1
텍스트 버튼에 허용되는 답변이어야합니다. 현재 허용 된 답변은 이미지 버튼에 적합합니다. 내가 op의 의견에서 얻는 것은 그가 텍스트 버튼을 가지고 있다는 것입니다.
Ali Hus

11

adjustsImageWhenDisabled속성을 사용할 수 있습니다UIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

전의:

 Button.adjustsImageWhenDisabled = false

2
그게 뭐에요? 왜 그걸 사용해야하는지 설명 할 수 있습니까?
Zippy February

7

이것은 오래된 질문이지만 이것을 달성하는 훨씬 간단한 방법이 있습니다.

myButton.userInteractionEnabled = false

버튼 모양을 변경하지 않고 터치 제스처 만 비활성화합니다.


5

에서 스위프트 :

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

또는

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0

5

title color다른 상태로 설정 :

@IBOutlet weak var loginButton: UIButton! {
        didSet {
            loginButton.setTitleColor(UIColor.init(white: 1, alpha: 0.3), for: .disabled)
            loginButton.setTitleColor(UIColor.init(white: 1, alpha: 1), for: .normal)
        }
    }

사용법 : (텍스트 색상이 자동으로 변경됩니다)

loginButton.isEnabled = false

여기에 이미지 설명을 입력하십시오


3

각 버튼이 아닌 Swift> 3.0으로 확장 프로그램 만들기

extension UIButton {
    override open var isEnabled : Bool {
        willSet{
            if newValue == false {
                self.setTitleColor(UIColor.gray, for: UIControlState.disabled)
            }
        }
    }
}

3

첫 번째 답변을 모두 사용할 수 있으며 더 나은 결과가 될 것입니다.

속성 관리자에서 (버튼을 선택할 때) 상태 구성을 사용 안 함으로 변경하여 사용하지 않을 때 표시 될 새 이미지를 설정하십시오 (콘텐츠-> 사용 확인에서 마커를 제거하여 사용 안함으로 설정하십시오) .

상태를 활성화로 변경하면 이미지가이 상태에서로드됩니다.

여기에 알파 로직을 추가하는 것이 좋습니다.


3

스위프트 4+

extension UIButton {
    override open var isEnabled: Bool {
        didSet {
            DispatchQueue.main.async {
                if self.isEnabled {
                    self.alpha = 1.0
                }
                else {
                    self.alpha = 0.6
                }
            }
        }
    }
}

사용하는 방법

myButton.isEnabled = false

2

나는 같은 문제에 갇혀있다. 알파 설정은 내가 원하는 것이 아닙니다.

UIButton" 배경 이미지 "및 " 배경색 "이 있습니다. 이미지의 경우 다음 UIButton과 같은 속성이 있습니다

@property (nonatomic) BOOL adjustsImageWhenDisabled

그리고 버튼이 비활성화되면 배경 이미지가 더 밝게 그려집니다. 배경색의 경우 Ravin의 솔루션 인 알파 설정이 정상적으로 작동합니다.

먼저, 유틸리티-속성 아래에서 "이미지 비활성화 조정"확인란을 선택 해제했는지 확인해야합니다.
그런 다음이 버튼의 배경색을 확인하십시오.

도움이 되길 바랍니다. 이것은 오래된 게시물이므로 Xcode에서 변경되었을 수 있습니다.


1

다음 코드가 제대로 작동하는 것 같습니다. 그러나 어떤 경우에는 작동하지 않습니다.

sendButton.enabled = NO;
sendButton.alpha = 0.5;

위의 코드가 작동하지 않으면 메인 스레드로 포장하십시오. 그래서

dispatch_async(dispatch_get_main_queue(), ^{
    sendButton.enabled = NO;
    sendButton.alpha = 0.5
});

이렇게 빨리 가면

DispatchQueue.main.async {
    sendButton.isEnabled = false
    sendButton.alpha = 0.5
}

또한 UIButton을 사용자 정의한 경우이를 Button 클래스에 추가하십시오.

override var isEnabled: Bool {
    didSet {
        DispatchQueue.main.async {
            if self.isEnabled {
                self.alpha = 1.0
            }
            else {
                self.alpha = 0.5
            }
        }
    }
}

감사하고 코딩을 즐기십시오 !!!


1

(가) 경우 UIButton의 결합 상태에 selected하고 disabled, 그 상태입니다 UIControlStateSelected | UIControlStateDisabled.

따라서 상태는 다음과 같이 조정해야합니다.

[button setTitleColor:color UIControlStateSelected | UIControlStateDisabled];
[button setImage:image forState:UIControlStateSelected | UIControlStateDisabled];

한 가지 방법은 UIButton다음과 같이 서브 클래 싱 하는 것입니다.

@implementation TTButton
- (void)awakeFromNib {
   [super awakeFromNib];

    //! Fix behavior when `disabled && selected`
    //! Load settings in `xib` or `storyboard`, and apply it again.
    UIColor *color = [self titleColorForState:UIControlStateDisabled];
    [self setTitleColor:color forState:UIControlStateDisabled];

    UIImage *img = [self imageForState:UIControlStateDisabled];
    [self setImage:img forState:UIControlStateDisabled];
}

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state {
    [super setTitleColor:color forState:state];

    //
    if (UIControlStateDisabled == state) {
        [super setTitleColor:color forState:UIControlStateSelected | state];
        [super setTitleColor:color forState:UIControlStateHighlighted | state];
    }
}

- (void)setImage:(UIImage *)image forState:(UIControlState)state {
    [super setImage:image forState:state];

    if (UIControlStateDisabled == state) {
        [super setImage:image forState:UIControlStateSelected | state];
        [super setImage:image forState:UIControlStateHighlighted | state];
    }
}

@end

1
이것이 정답입니다. Swift에서는 setTitleColor (disabledColor, for : [.disabled, .selected])와 같은 것이 필요합니다.
Paulo Cesar

0

이 질문에는 많은 답변이 있지만 backgroundColor를 사용하여 버튼의 스타일을 지정하려는 경우에는별로 유용하지 않습니다. UIButton에는 다른 제어 상태에 대해 서로 다른 이미지를 설정하는 좋은 옵션이 있지만 배경색에 대한 동일한 기능은 없습니다. 따라서 해결책 중 하나는 색상에서 이미지를 생성하고 버튼에 적용하는 확장을 추가하는 것입니다.

extension UIButton {
  private func image(withColor 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(image(withColor: color), for: state)
  }
}

이 솔루션의 한 가지 문제-스토리 보드에서 만든 버튼에는이 변경 사항이 적용되지 않습니다. 나에 관해서는 코드에서 UI 스타일을 선호하기 때문에 문제가되지 않습니다. 스토리 보드를 사용하려면 @IBInspectable필요한 추가 마법이 필요합니다.

두 번째 옵션은 서브 클래 싱이지만 이것을 피하는 것이 좋습니다.


0

버튼을 서브 클래 싱하고 isEnabled 변수를 재정의 할 수 있습니다. 장점은 여러 위치에서 재사용 할 수 있다는 것입니다.

override var isEnabled: Bool {
     didSet {
         if isEnabled {
             self.alpha = 1
         } else {
             self.alpha = 0.2
         }
     }
 }

-1
#import "UIButton+My.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIButton (My)


-(void)fade :(BOOL)enable{
    self.enabled=enable;//
    self.alpha=enable?1.0:0.5;
}

@end

.h :

#import <UIKit/UIKit.h>
@interface UIButton (My)

-(void)fade :(BOOL)enable;

@end

2
코드와 함께 설명하면 더 나은 답변을 얻을 수 있습니다.
Phantômaxx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.