Отключено UIButton не выцветшее или серое

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

sendButton.enabled = YES;

или

sendButton.enabled = NO;

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

Ответ 1

Вы можете использовать следующий код:

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

or

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

Ответ 2

просто измените конфигурацию состояния, чтобы отключить и выберите то, что вы хотите, фоновое изображение для отключенного состояния

введите описание изображения здесь

Ответ 3

Другой вариант - изменить цвет текста (например, светло-серый) для отключенного состояния. В редакторе раскадровки выберите "Отключено" из всплывающей кнопки "Конфигурация состояния" и используйте кнопку "Цвет текста", чтобы изменить цвет текста. В коде используйте сообщение -setTitleColor: forState:.

(Я понимаю, что это более старая должность, но я думал, что другим может понравиться этот вариант)

Ответ 4

Попробуйте установить разные изображения для UIControlStateDisabled (отключено серые изображения) и UIControlStateNormal (нормальное изображение), чтобы кнопка сгенерировала для вас отключенное состояние.

Ответ 5

Если вы используете текстовую кнопку, вы можете поместить в viewDidLoad метод экземпляра

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

Пример:

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

Ответ 6

Чтобы кнопка была блеклой при отключении, вы можете установить альфа для нее. Для вас есть два варианта:

Первый способ: если вы хотите подать заявку на все свои кнопки в вашем приложении, вы можете написать 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
        }
    }
}

Ответ 7

Вы можете использовать adjustsImageWhenDisabled, который является свойством UIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

Пример:

 Button.adjustsImageWhenDisabled = false

Ответ 8

Это довольно старый вопрос, но есть простой способ достичь этого.

myButton.userInteractionEnabled = false

Это отключит любые сенсорные жесты, не изменяя внешний вид кнопки

Ответ 9

В Swift:

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

или

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0

Ответ 10

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

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

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

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

Привет!

Ответ 11

Создайте расширение в Swift > 3.0, а не каждую кнопку

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

Ответ 12

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

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

@property (nonatomic) BOOL adjustsImageWhenDisabled

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

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

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

Ответ 13

Установите 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

Ответ 14

Если 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

Ответ 15

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

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

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

Ответ 16

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

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

Ответ 17

#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