失效的 UIButton 不褪色或灰色

在我的 iPhone 应用程序中,我用 Interface Builder 创建了一个 UIButton。我可以像这样在我的代码中成功地启用和禁用它..。

sendButton.enabled = YES;

或者

sendButton.enabled = NO;

但是,按钮的视觉外观总是相同的!它既不褪色也不灰暗。如果我尝试单击它,它将按预期启用或禁用。我错过了什么吗?它不应该看起来褪色或灰色吗?

123142 次浏览

尝试为 UIControlStateDisabled(禁用灰度图像)和 UIControlStateNormal(正常图像)设置不同的图像,以便按钮为您生成禁用状态。

您可以使用以下代码:

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


or


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

另一个选项是更改禁用状态的文本颜色(例如,为浅灰色)。

在故事板编辑器中,从 State Config弹出按钮中选择 Disabled。使用 Text Color弹出按钮来更改文本颜色。

在代码中,使用 -setTitleColor:forState:消息。

你可以同时使用前两个答案,这样会得到更好的结果。

在属性检查器中(当您选择按钮时) ,将 State Config 更改为 Disable,以设置禁用后将出现的新 Image (删除 Content-> Enable 检查中的标记,使其禁用)。

当您将状态更改为启用状态时,图像将从此状态加载图像。

添加 alpha 逻辑是一个很好的细节。

如果使用文本按钮,则可以将实例方法放入 viewDidLoad

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

例如:

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

斯威夫特:

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

或者

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0
#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

我被同一个问题困住了,我不想设置 α。

UIButton有“ 背景图像背景图像”和“ 背景色”。 对于图像,UIButton的属性为

@property (nonatomic) BOOL adjustsImageWhenDisabled

当按钮被禁用时,背景图像被绘制得更轻。 对于背景颜色,设置阿尔法,拉文的解决方案,工作正常。

首先,您必须检查是否有未选中的“禁用调整图像”框下的工具-属性。
然后,检查这个按钮的背景颜色。

(希望对您有所帮助。这是一篇老文章; Xcode 中的内容可能有所改变)。

只需更改状态配置禁用并选择您想要的,禁用状态的背景图像

enter image description here

您可以使用 adjustsImageWhenDisabled,它是 UIButton的属性
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

例如:

 Button.adjustsImageWhenDisabled = false

这是一个相当古老的问题,但有一个非常简单的方法来实现这一点。

myButton.userInteractionEnabled = false

这只会在不改变按钮外观的情况下禁用任何触摸手势

如果 UIButton处于 selecteddisabled的组合状态,则其状态为 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

在 Swift > 3.0中创建一个扩展,而不是单独创建每个按钮

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

要使按钮在禁用时褪色,您可以为它设置 alpha:

第一种方法 : 如果你想申请应用程序中的所有按钮,那么你可以像这样为 UIButton 编写 extension:

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
}
}
}

这个问题有很多答案,但是如果你真的想使用 backoundColor 来设计你的按钮,这些答案看起来都不是很有用。 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需要。

第二个选项是子类化,但我倾向于避免这种情况。

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

enter image description here

下面的代码看起来工作得很好,但是在某些情况下,它不能工作。

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 扩展函数。

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
}
}
}

谢谢你,并享受编码! ! !

也许您可以子类化您的按钮并覆盖您的 isEnable 变量。其优点是可以在多个地方重用。

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

Swift 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