programing

비활성화된 UIButton 색이 바랜다거나 회색이 아님

i4 2023. 5. 31. 15:16
반응형

비활성화된 UIButton 색이 바랜다거나 회색이 아님

제 아이폰 앱에는 인터페이스 빌더에 만든 UI 버튼이 있습니다.내 코드에서 이렇게 활성화하고 비활성화할 수 있습니다...

sendButton.enabled = YES;

또는

sendButton.enabled = NO;

하지만, 버튼의 시각적인 모양은 항상 같습니다!색이 바래거나 회색이 아닙니다.하지만 클릭을 시도하면 예상대로 활성화 또는 비활성화됩니다.내가 뭘 빼놓았나요?색이 바래거나 회색으로 보여야 하지 않나요?

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

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

or

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

상태 구성을 비활성화하고 원하는 것을 선택하도록 변경하기만 하면 됩니다. 비활성화 상태의 배경 이미지

여기에 이미지 설명 입력

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

에서 스리보드편서에다선음다택니합을집기를 선택합니다.DisabledState Config팝업 버튼.사용Text Color팝업 단추를 눌러 텍스트 색을 변경합니다.

코드에서는 다음을 사용합니다.-setTitleColor:forState:메세지.

비활성화 시 버튼이 희미해지도록 하려면 알파를 설정합니다.두 가지 옵션이 있습니다.

번째 방법:만약 당신이 당신의 앱의 모든 버튼을 신청하고 싶다면, 당신은 쓸 수 있습니다.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
        }
    }
}

다음에 대한 다른 이미지를 설정합니다.UIControlStateDisabled 이미지)및 (비활성화된 회색 이미지) »UIControlStateNormal(정상 영상) 버튼을 누르면 비활성화 상태가 생성됩니다.

텍스트 버튼을 사용하는 경우 viewDidLoad 인스턴스 메서드를 사용할 수 있습니다.

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

예:

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

사용할 수 있습니다.adjustsImageWhenDisabledUIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

예:

 Button.adjustsImageWhenDisabled = false

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

여기에 이미지 설명 입력

이것은 꽤 오래된 질문이지만 이것을 달성하는 방법은 매우 간단합니다.

myButton.userInteractionEnabled = false

이렇게 하면 버튼의 모양을 변경하지 않고 터치 제스처만 비활성화됩니다.

스위프트 4+

extension UIButton {
    override open var isEnabled: Bool {
        didSet {
            if self.isEnabled {
                self.alpha = 1.0
            }
            else {
                self.alpha = 0.5
            }
            //make sure button is updated
            self.layoutIfNeeded()
        }
    }
}

사용방법

myButton.isEnabled = false

Swift에서:

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

또는

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0

각 버튼이 아닌 Swift > 3.0으로 확장 생성

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

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

특성 검사기(버튼을 선택하는 경우)에서 상태 구성을 사용 안 함으로 변경하여 사용 안 함으로 설정할 때 표시될 새 이미지를 사용 안 함으로 설정합니다(내용->사용 가능 확인에서 마커를 제거하여 사용 안 함으로 설정).

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

여기에 알파 논리를 추가하는 것은 좋은 세부 사항입니다.

다음 코드가 잘 작동하는 것 같습니다.하지만 어떤 경우에는, 이것이 작동하지 않습니다.

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

위 코드가 작동하지 않으면 메인 스레드로 포장해주세요.그렇게

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

만약 당신이 swift로 간다면, 이렇게.

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

또한, 여기에 UIButton 확장 기능을 작성합니다.

extension UIButton {
    func enable() {
        DispatchQueue.main.async {
            self.isEnabled = true
            self.alpha = 1.0
        }
    }

    func disable() {
        DispatchQueue.main.async {
            self.isEnabled = false
            self.alpha = 0.5
        }
    }
}

감사합니다. 코딩을 즐겨보세요!!!

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

UIButton에는 "배경 이미지" 및 "배경 색상"이 있습니다.이미지의 경우,UIButton로의 속성을 가지고 있습니다.

@property (nonatomic) BOOL adjustsImageWhenDisabled

그리고 버튼이 비활성화되면 배경 이미지가 더 밝게 그려집니다.배경색은 라빈의 솔루션인 알파 설정이 잘 됩니다.

먼저 Utilities-Attributes에서 "Disabled adjusted image" 상자를 선택하지 않았는지 확인해야 합니다.
그런 다음, 이 버튼의 배경색을 확인합니다.

(도움이 되길 바랍니다.이전 게시물입니다. Xcode에서 상황이 변경되었을 수 있습니다.

만약에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

버튼을 하위 분류하고 isEnabled 변수를 재정의할 수 있습니다.장점은 여러 곳에서 재사용할 수 있다는 것입니다.

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

이 질문에는 많은 답이 있지만 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필요했다.

두 번째 옵션은 하위 분류이지만 저는 이것을 피하고 싶습니다.

#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

언급URL : https://stackoverflow.com/questions/5715092/disabled-uibutton-not-faded-or-grey

반응형