Інваліди UIButton не вицвіли або сіріли


135

У своєму додатку iPhone у мене є UIButton, який я створив у Interface Builder. Я можу успішно включити та відключити його так у своєму коді ...

sendButton.enabled = YES;

або

sendButton.enabled = NO;

Однак візуальний вигляд кнопки завжди однаковий! Вона не вицвіла і не сіріла. Якщо я спробую натиснути його, він увімкнений або відключений, як очікувалося. Я щось пропускаю? Чи не повинен він виглядати зів’ялим або сірим?


Ви використовуєте зображення за допомогою UIButton?
Jhaliya

Ні, це не так, вам потрібно буде встановити його альфа, відповідно, воно буде працювати.
Равін

Відповіді:


187

Ви можете використовувати наступний код:

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

or

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

12
Хоча це працює, я вважаю, що рішення, які змінюють вигляд залежно від стану керування, як це, і це знизу, є набагато кращою ідеєю. Вони використовують вбудований механізм для автоматичної зміни, а не потребують явного оновлення вигляду елемента управління залежно від його стану.
Бенджон

78

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

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


13
Це змінює лише властивості в підзаголовку кнопки . Колір фону знаходиться в підзаголовку Перегляд , тому його не змінюють конфігурації стану.
Мисливець Мисливець

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, для: [. Вимкнено, .вибрано])
Пауло Сезар

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

.h:

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