在我的 iPhone 应用程序中,我用 Interface Builder 创建了一个 UIButton。我可以像这样在我的代码中成功地启用和禁用它..。
sendButton.enabled = YES;
或者
sendButton.enabled = NO;
但是,按钮的视觉外观总是相同的!它既不褪色也不灰暗。如果我尝试单击它,它将按预期启用或禁用。我错过了什么吗?它不应该看起来褪色或灰色吗?
尝试为 UIControlStateDisabled(禁用灰度图像)和 UIControlStateNormal(正常图像)设置不同的图像,以便按钮为您生成禁用状态。
UIControlStateDisabled
UIControlStateNormal
您可以使用以下代码:
sendButton.enabled = YES; sendButton.alpha = 1.0; or sendButton.enabled = NO; sendButton.alpha = 0.5;
另一个选项是更改禁用状态的文本颜色(例如,为浅灰色)。
在故事板编辑器中,从 State Config弹出按钮中选择 Disabled。使用 Text Color弹出按钮来更改文本颜色。
State Config
Disabled
Text Color
在代码中,使用 -setTitleColor:forState:消息。
-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的属性为
UIButton
@property (nonatomic) BOOL adjustsImageWhenDisabled
当按钮被禁用时,背景图像被绘制得更轻。 对于背景颜色,设置阿尔法,拉文的解决方案,工作正常。
首先,您必须检查是否有未选中的“禁用调整图像”框下的工具-属性。 然后,检查这个按钮的背景颜色。
(希望对您有所帮助。这是一篇老文章; Xcode 中的内容可能有所改变)。
只需更改状态配置禁用并选择您想要的,禁用状态的背景图像
您可以使用 adjustsImageWhenDisabled,它是 UIButton的属性 (@property (nonatomic) BOOL adjustsImageWhenDisabled)
adjustsImageWhenDisabled
(@property (nonatomic) BOOL adjustsImageWhenDisabled)
Button.adjustsImageWhenDisabled = false
这是一个相当古老的问题,但有一个非常简单的方法来实现这一点。
myButton.userInteractionEnabled = false
这只会在不改变按钮外观的情况下禁用任何触摸手势
如果 UIButton处于 selected和 disabled的组合状态,则其状态为 UIControlStateSelected | UIControlStateDisabled。
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
在 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
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需要。
@IBInspectable
第二个选项是子类化,但我倾向于避免这种情况。
将 title color设置为不同的状态:
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
下面的代码看起来工作得很好,但是在某些情况下,它不能工作。
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