禁用的UIButton不会褪色或呈灰色

| 在我的iPhone应用程序中,我有一个在Interface Builder中创建的UIButton。我可以在代码中像这样成功地启用和禁用它...
sendButton.enabled = YES;
要么
sendButton.enabled = NO;
但是,按钮的外观总是一样的!它没有褪色或灰色。如果我尝试单击它,则会按预期启用或禁用它。我想念什么吗?它看起来不应该褪色还是灰色吗?
已邀请:
您可以使用以下代码:
sendButton.enabled = YES;
sendButton.alpha = 1.0;

or

sendButton.enabled = NO;
sendButton.alpha = 0.5;
只需将状态配置更改为禁用并选择所需的背景,禁用状态的背景图片
另一个选项是更改禁用状态的文本颜色(例如,更改为浅灰色)。 在情节提要板编辑器中,从
State Config
弹出按钮中选择
Disabled
。使用
Text Color
弹出按钮更改文本颜色。 在代码中,使用
-setTitleColor:forState:
消息。
尝试为
UIControlStateDisabled
(禁用的灰度图像)和
UIControlStateNormal
(普通图像)设置不同的图像,以便按钮为您生成禁用状态。
要使按钮在禁用时淡出,可以为其设置Alpha。有两个选项供您选择: 第一种方式:如果您想在应用中申请所有按钮,则可以为UIButton编写“ 9”,如下所示:
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
        }
    }
}
如果使用文本按钮,则可以将viewDidLoad实例方法放入
- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state
例:
[self.syncImagesButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
您可以使用
adjustsImageWhenDisabled
,它是
UIButton
的属性
(@property (nonatomic) BOOL adjustsImageWhenDisabled)
例如:
 Button.adjustsImageWhenDisabled = false
这是一个很老的问题,但是有一个很简单的方法可以实现。
myButton.userInteractionEnabled = 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)
            }
        }
    }
}
您可以同时使用这两个答案,这将是一个更好的结果。 在属性检查器中(当您选择按钮时),将“状态配置”更改为“禁用”以设置在禁用状态下将要显示的新图像(删除“内容”->“启用”检查中的标记以将其禁用) )。 并且当您将状态更改为启用时,映像将从该状态加载一个。 向其添加alpha逻辑是一个很好的细节。
我陷入了同样的问题。设置Alpha不是我想要的。
UIButton
具有\“背景图像\”和\“背景颜色\”。 对于图像,
UIButton
具有
@property (nonatomic) BOOL adjustsImageWhenDisabled
禁用该按钮后,背景图像会变得更亮。 对于背景色,设置Ravin解决方案的alpha效果很好。 首先,您必须检查是否未选中“实用程序-属性”下的“禁用调整图像”框。 然后,检查此按钮的背景色。 (希望它有帮助。这是一篇过时的文章; Xcode中的内容可能已更改)。
为不同的状态设置different25ѭ:
@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
看起来以下代码可以正常工作。但是在某些情况下,这是行不通的。
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
            }
        }
    }
}
谢谢,喜欢编码!!!
如果
UIButton
处于
selected
disabled
的组合状态,则其状态为
UIControlStateSelected | UIControlStateDisabled
。 因此,其状态需要像这样调整:
[button setTitleColor:color UIControlStateSelected | UIControlStateDisabled];
[button setImage:image forState:UIControlStateSelected | UIControlStateDisabled];
一种方法是将“ 15”子类如下:
@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
这个问题有很多答案,但是如果您真的想使用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样式。如果要使用情节提要,则需要额外的ѭ40magic魔法。 第二种选择是子类化,但我宁愿避免这种情况。
#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

要回复问题请先登录注册