Отключенная кнопка UIB не выцветшая и не серая - PullRequest
117 голосов
/ 19 апреля 2011

В моем приложении для iPhone есть UIButton, который я создал в Interface Builder.Я могу успешно включить и отключить его в своем коде следующим образом ...

sendButton.enabled = YES;

или

sendButton.enabled = NO;

Однако внешний вид кнопки всегда одинаков!Он не выцветший и не серый.Если я попытаюсь нажать на него, он будет включен или отключен, как и ожидалось.Я что-то пропустил?Разве он не должен выглядеть блеклым или серым?

спасибо

Ответы [ 17 ]

3 голосов
/ 21 мая 2013

Вы можете использовать оба первых ответа, и это будет лучший результат.

В инспекторе атрибутов (когда вы выбираете кнопку) измените параметр «Конфигурация состояния» на «Отключено», чтобы установить новое изображение, которое будет отображаться при его отключении (уберите маркер в проверке «Содержимое-> Включено», чтобы сделать это отключено).

А когда вы меняете состояние на включенное, изображение будет загружаться из этого состояния.

Добавление альфа-логики - хорошая деталь.

Привет!

2 голосов
/ 30 августа 2018

Набор 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

2 голосов
/ 22 апреля 2015

Я застрял на той же проблеме. Настройка альфа не то, что я хочу.

UIButton имеет " фоновое изображение " и " цвет фона ". Для изображения UIButton имеет свойство

@property (nonatomic) BOOL adjustsImageWhenDisabled

И фоновое изображение рисуется светлее, когда кнопка отключена. Для цвета фона отлично работает настройка alpha, решение Равина.

Во-первых, вы должны проверить, не установлен ли флажок «отключено настраивает изображение» в разделе «Утилиты-атрибуты». Затем проверьте цвет фона для этой кнопки.

(Надеюсь, это полезно. Это старая запись; в Xcode все могло измениться).

1 голос
/ 14 марта 2019

Похоже, что следующий код работает нормально.Но в некоторых случаях это не работает.

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, добавьте это в класс Button.

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

Спасибо и наслаждайтесь кодированием !!!

1 голос
/ 07 сентября 2016

Если UIButton находится в состоянии в сочетании с selected и disabled, его состояние равно UIControlStateSelected | UIControlStateDisabled.

Итак, это состояние нужно отрегулировать на

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

Подкласс UIButton подходит следующим образом.

@implementation TTButton
- (void)awaeFromNib {
   [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
0 голосов
/ 15 августа 2018

На этот вопрос есть много ответов, но все они выглядят не очень полезными, если вы действительно хотите использовать 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)
  }
}

Единственная проблема этого решения - это изменение не будет применено к кнопкам, созданным в раскадровке.Что касается меня, это не проблема, потому что я предпочитаю стилизовать пользовательский интерфейс из кода.Если вы хотите использовать раскадровки, тогда понадобится дополнительная магия с @IBInspectable.

Второй вариант - создание подклассов, но я предпочитаю избегать этого.

0 голосов
/ 04 декабря 2014
#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...