Отключенная кнопка UIB не выцветшая и не серая


135

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

sendButton.enabled = YES;

или

sendButton.enabled = NO;

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


Вы используете изображение с UIButton?
Джалия

Нет, это не так, вам нужно будет установить его альфа, соответственно, он будет работать.
Равин

Ответы:


187

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

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

or

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

12
Хотя это работает, я считаю, что решения, которые меняют внешний вид в зависимости от состояния управления, как это, и это снизу, являются гораздо лучшей идеей. Они используют встроенный механизм для достижения автоматического изменения, вместо того, чтобы явно обновлять внешний вид элемента управления в зависимости от его состояния.
Бенджон

78

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

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


13
Это только меняет свойства в подзаголовке кнопки . Цвет фона находится в подзаголовке View , поэтому не изменяется конфигами состояния.
Охотник Монах

2
Это не работает для цвета фона представления. В своем проекте я объединил предыдущий ответ и этот.
Антон

40

Другой вариант - изменить цвет текста (например, на светло-серый) для отключенного состояния.

В редакторе раскадровки выберите Disabledиз State Configвсплывающей кнопки. Используйте Text Colorвсплывающую кнопку, чтобы изменить цвет текста.

В коде используйте -setTitleColor:forState:сообщение.


Это кажется гораздо лучшим решением, чем исключительный ответ по настройке альфа. Я уже проголосовал за это несколько месяцев назад, и теперь я вернулся с той же проблемой, я хотел бы сделать это снова!
Бенджон

Да, похоже, это рабочее решение. Я просто использую светло-серый цвет.
атерешков

23

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


2
он не использует изображения - но вы можете применить эту же концепцию к [ UIButton setAttributedTitle:forState:]. Создайте атрибутивную строку, в которой цвет текста переднего плана установлен на прозрачный цвет.
nielsbot

20

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

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

13

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

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

пример:

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

1
Это должен быть принятый ответ для текстовой кнопки. Текущий принятый ответ подходит для кнопки с изображением. Что я получаю из комментариев опа, так это то, что у него есть текстовая кнопка ..
Али Гус

11

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

Пример:

 Button.adjustsImageWhenDisabled = false

2
Что это делает? Можете ли вы объяснить, почему он должен это использовать?
Zippy

7

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

myButton.userInteractionEnabled = false

Это отключит только сенсорные жесты без изменения внешнего вида кнопки.



5

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

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


3

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

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

3

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

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

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

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


3

Свифт 4+

extension UIButton {
    override open var isEnabled: Bool {
        didSet {
            DispatchQueue.main.async {
                if self.isEnabled {
                    self.alpha = 1.0
                }
                else {
                    self.alpha = 0.6
                }
            }
        }
    }
}

Как пользоваться

myButton.isEnabled = false

2

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

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

@property (nonatomic) BOOL adjustsImageWhenDisabled

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

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

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


1

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

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

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


1

Если UIButtonнаходится в комбинированном состоянии 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

1
Это должен быть принятый ответ. В Swift вам понадобится что-то вроде setTitleColor (disabledColor, для: [.disabled, .selected])
Пауло Сезар

0

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

Возможно, вы можете создать подкласс для своей кнопки и переопределить переменную isEnabled. Преимущество заключается в том, что вы можете повторно использовать в нескольких местах.

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

-1
#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

.час:

#import <UIKit/UIKit.h>
@interface UIButton (My)

-(void)fade :(BOOL)enable;

@end

2
Некоторое описание, сопровождающее ваш код, поможет вам лучше ответить.
Phantômaxx
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.