Ответ 1
Вы можете использовать следующий код:
sendButton.enabled = YES;
sendButton.alpha = 1.0;
or
sendButton.enabled = NO;
sendButton.alpha = 0.5;
В моем приложении для iPhone есть UIButton, который я создал в Interface Builder. Я могу успешно включить и отключить это в моем коде...
sendButton.enabled = YES;
или
sendButton.enabled = NO;
Однако внешний вид кнопки всегда один и тот же! Он не выцветший и не серый. Если я попытаюсь нажать на него, он будет включен или отключен, как и ожидалось. Я что-то пропустил? Разве это не должно выглядеть блеклым или серым?
Вы можете использовать следующий код:
sendButton.enabled = YES;
sendButton.alpha = 1.0;
or
sendButton.enabled = NO;
sendButton.alpha = 0.5;
просто измените конфигурацию состояния, чтобы отключить и выберите то, что вы хотите, фоновое изображение для отключенного состояния
Другой вариант - изменить цвет текста (например, светло-серый) для отключенного состояния. В редакторе раскадровки выберите "Отключено" из всплывающей кнопки "Конфигурация состояния" и используйте кнопку "Цвет текста", чтобы изменить цвет текста. В коде используйте сообщение -setTitleColor: forState:.
(Я понимаю, что это более старая должность, но я думал, что другим может понравиться этот вариант)
Попробуйте установить разные изображения для UIControlStateDisabled
(отключено серые изображения) и UIControlStateNormal
(нормальное изображение), чтобы кнопка сгенерировала для вас отключенное состояние.
Если вы используете текстовую кнопку, вы можете поместить в viewDidLoad метод экземпляра
- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state
Пример:
[self.syncImagesButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
Чтобы кнопка была блеклой при отключении, вы можете установить альфа для нее. Для вас есть два варианта:
Первый способ: если вы хотите подать заявку на все свои кнопки в вашем приложении, вы можете написать 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
}
}
}
Вы можете использовать adjustsImageWhenDisabled
, который является свойством UIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)
Пример:
Button.adjustsImageWhenDisabled = false
Это довольно старый вопрос, но есть простой способ достичь этого.
myButton.userInteractionEnabled = false
Это отключит любые сенсорные жесты, не изменяя внешний вид кнопки
В Swift:
previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5
или
nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0
Вы можете использовать оба первых ответа и стать лучшим результатом.
В инспекторе атрибутов (при выборе кнопки) измените параметр "Конфигурация состояния" на "Отключено", чтобы установить новое изображение, которое будет отображаться, когда оно отключено (удалите маркер в окне "Контент- > Включено", чтобы сделать он отключен).
И когда вы измените состояние на включенное, изображение загрузит одно из этого состояния.
Добавление альфа-логики к этому - хорошая деталь.
Привет!
Создайте расширение в Swift > 3.0, а не каждую кнопку
extension UIButton {
override open var isEnabled : Bool {
willSet{
if newValue == false {
self.setTitleColor(UIColor.gray, for: UIControlState.disabled)
}
}
}
Я застрял в той же проблеме. Настройка альфы не то, что я хочу.
UIButton
имеет "фоновое изображение" и "цвет фона".
Для изображения UIButton
имеет свойство как
@property (nonatomic) BOOL adjustsImageWhenDisabled
И изображение фона становится светлее, когда кнопка отключена. Для цвета фона настройка альфа-решения Ravin отлично работает.
Во-первых, вы должны проверить, было ли у вас снято флажок "отключено настроить изображение" в разделе "Утилиты-атрибуты".
Затем проверьте цвет фона для этой кнопки.
(Надеюсь, что это полезно. Это старый пост, все может измениться в Xcode).
Установите 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
Если 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
Похоже, следующий код работает нормально. Но в некоторых случаях это не работает.
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
}
}
}
}
Спасибо и наслаждайтесь кодированием !!!
На этот вопрос есть много ответов, но все они выглядят не очень полезными, если вы действительно хотите использовать 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
.
Второй вариант - это создание подклассов, но я предпочитаю избегать этого.
#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