UIButton yang dinonaktifkan tidak pudar atau abu-abu

135

Di aplikasi iPhone saya, saya memiliki UIButton yang saya buat di Interface Builder. Saya dapat berhasil mengaktifkan dan menonaktifkannya seperti ini dalam kode saya ...

sendButton.enabled = YES;

atau

sendButton.enabled = NO;

Namun, tampilan visual tombol selalu sama! Itu tidak pudar atau abu-abu. Jika saya mencoba mengkliknya, itu diaktifkan atau dinonaktifkan seperti yang diharapkan. Apakah saya melewatkan sesuatu? Bukankah seharusnya terlihat pudar atau abu-abu?

Andy A
sumber
Apakah Anda ingin menggunakan gambar dengan UIButton?
Jhaliya
Tidak, tidak, Anda perlu mengatur alpha-nya, karenanya, itu akan bekerja.
Ravin

Jawaban:

187

Anda dapat menggunakan kode berikut:

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

or

sendButton.enabled = NO;
sendButton.alpha = 0.5;
Hasil buruan
sumber
12
Meskipun ini berfungsi saya rasa solusi yang mengubah tampilan tergantung pada kondisi kontrol seperti ini dan ini dari bawah adalah ide yang jauh lebih baik. Mereka menggunakan mekanisme bawaan untuk mencapai perubahan otomatis, daripada perlu memperbarui tampilan kontrol secara eksplisit, tergantung pada kondisinya.
Benjohn
78

hanya mengubah konfigurasi negara untuk menonaktifkan dan memilih apa yang Anda inginkan, gambar latar belakang untuk keadaan dinonaktifkan

masukkan deskripsi gambar di sini

Ahmed R.
sumber
13
Ini hanya mengubah properti di subtitle tombol . Warna latar belakang berada di bawah subjudul Lihat , jadi tidak diubah oleh konfigurasi negara.
Hunter Monk
2
Ini tidak berfungsi untuk warna latar belakang tampilan. Dalam proyek saya, saya menggabungkan jawaban sebelumnya dan ini.
Anton
40

Pilihan lain adalah mengubah warna teks (menjadi abu-abu terang misalnya) untuk keadaan dinonaktifkan.

Di editor papan cerita, pilih Disableddari State Configtombol sembulan. Gunakan Text Colortombol sembulan untuk mengubah warna teks.

Dalam kode, gunakan -setTitleColor:forState:pesan.

guywithmazda
sumber
Ini sepertinya solusi yang jauh lebih baik daripada jawaban yang disesuaikan untuk menyesuaikan alpha. Saya sudah memilih ini beberapa bulan yang lalu dan sekarang saya kembali ke sini dengan masalah yang sama, saya berharap bisa melakukannya lagi!
Benjohn
Yap, sepertinya ini solusi yang berhasil. Saya hanya menggunakan warna abu-abu terang.
atereshkov
23

Cobalah untuk mengatur gambar yang berbeda untuk UIControlStateDisabled(gambar abu-abu dinonaktifkan) dan UIControlStateNormal(Gambar normal) sehingga tombol menghasilkan negara dinonaktifkan untuk Anda.

Jhaliya
sumber
2
dia tidak menggunakan gambar - tetapi Anda dapat menerapkan konsep yang sama ini [ UIButton setAttributedTitle:forState:]. Buat string yang dikaitkan dengan Anda di mana warna latar depan teks Anda diatur ke warna transparan.
nielsbot
20

Untuk membuat tombol pudar saat menonaktifkan, Anda dapat mengatur alpha untuk itu. Ada dua opsi untuk Anda:

Cara pertama : Jika Anda ingin menerapkan semua tombol di aplikasi Anda, maka Anda dapat menulis extensionuntuk UIButton seperti ini:

extension UIButton {

    open override var isEnabled: Bool{
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }

}

Cara kedua : Jika Anda hanya ingin menerapkan beberapa tombol di aplikasi Anda, maka Anda dapat menulis kelas khusus dari UIButton seperti di bawah ini dan menggunakan kelas ini yang ingin Anda terapkan:

class MyButton: UIButton {
    override var isEnabled: Bool {
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }
}
Heo Ht Hades
sumber
13

Jika Anda menggunakan tombol teks, Anda dapat memasukkan viewDidLoad metode instance

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

contoh:

[self.syncImagesButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
Antonio Moro
sumber
1
Ini harus menjadi jawaban yang diterima untuk tombol teks .. Jawaban yang diterima saat ini baik untuk tombol gambar. Apa yang saya dapatkan dari komentar op adalah dia memiliki tombol teks ..
Ali Hus
11

Anda dapat menggunakan adjustsImageWhenDisabledyang merupakan properti dariUIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

Ex:

 Button.adjustsImageWhenDisabled = false
Mahesh Lad
sumber
2
Apa fungsinya? Bisakah Anda menjelaskan mengapa dia harus menggunakannya?
Zippy
7

Ini adalah pertanyaan yang cukup lama tetapi ada banyak cara sederhana untuk mencapai ini.

myButton.userInteractionEnabled = false

Ini hanya akan menonaktifkan gerakan sentuh apa pun tanpa mengubah tampilan tombol

Diego A. Rincon
sumber
5

Dalam Swift :

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

atau

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0
Raja-Penyihir
sumber
5

Diatur title coloruntuk status yang berbeda:

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

Penggunaan: (warna teks akan berubah secara otomatis)

loginButton.isEnabled = false

masukkan deskripsi gambar di sini

Kiran S
sumber
3

Buat ekstensi di Swift> 3.0 daripada masing-masing tombol dengan sendirinya

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

Anda dapat menggunakan kedua jawaban pertama dan akan menjadi hasil yang lebih baik.

Di pemeriksa atribut (ketika Anda memilih tombol), ubah State Config ke Disabled untuk mengatur gambar baru yang akan muncul ketika dinonaktifkan (hapus penanda di Content-> Diaktifkan centang untuk membuatnya dinonaktifkan) .

Dan ketika Anda mengubah status ke diaktifkan, gambar akan memuat yang dari keadaan ini.

Menambahkan logika alfa ke ini adalah detail yang bagus.

ChavirA
sumber
3

Swift 4+

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

Cara Penggunaan

myButton.isEnabled = false
Rashid Latif
sumber
2

Saya terjebak pada masalah yang sama. Pengaturan alpha bukan yang saya inginkan.

UIButtonmemiliki " gambar latar belakang " dan " warna latar belakang ". Untuk gambar, UIButtonmemiliki properti sebagai

@property (nonatomic) BOOL adjustsImageWhenDisabled

Dan gambar latar belakang dibuat lebih terang saat tombol dinonaktifkan. Untuk warna latar belakang, pengaturan alfa, solusi Ravin, berfungsi dengan baik.

Pertama, Anda harus memeriksa apakah Anda telah mencentang kotak "nonaktifkan menyesuaikan gambar" di bawah Utilities-Attributes.
Kemudian, periksa warna latar belakang untuk tombol ini.

(Semoga bermanfaat. Ini adalah posting lama; semuanya mungkin telah berubah di Xcode).

Yichao Lu
sumber
1

Sepertinya kode berikut berfungsi dengan baik. Tetapi dalam beberapa kasus, ini tidak berhasil.

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

Jika kode di atas tidak berfungsi, silakan bungkus di Utas Utama. begitu

dispatch_async(dispatch_get_main_queue(), ^{
    sendButton.enabled = NO;
    sendButton.alpha = 0.5
});

jika Anda pergi dengan cepat, seperti ini

DispatchQueue.main.async {
    sendButton.isEnabled = false
    sendButton.alpha = 0.5
}

Selain itu, jika Anda mengkustomisasi UIButton, tambahkan ini ke kelas Button.

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

Terima kasih dan nikmati pengkodean !!!

Li Jin
sumber
1

Jika UIButtonberada dalam keadaan gabungan dari selecteddan disabled, keadaannya adalahUIControlStateSelected | UIControlStateDisabled .

Jadi negaranya perlu disesuaikan seperti ini:

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

Salah satu pendekatan adalah dengan subkelas UIButtonsebagai berikut:

@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
AechoLiu
sumber
1
Ini harus menjadi jawaban yang diterima. Di Swift, Anda memerlukan sesuatu seperti setTitleColor (disabledColor, untuk: [.disabled, .selected])
Paulo Cesar
0

Pertanyaan ini memiliki banyak jawaban tetapi semuanya terlihat tidak terlalu berguna jika Anda benar-benar ingin menggunakan backgroundColor untuk menata tombol Anda. UIButton memiliki opsi bagus untuk mengatur gambar yang berbeda untuk status kontrol berbeda tetapi tidak ada fitur yang sama untuk warna latar belakang. Jadi salah satu solusinya adalah menambahkan ekstensi yang akan menghasilkan gambar dari warna dan menerapkannya pada tombol.

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

Hanya satu masalah dengan solusi ini - perubahan ini tidak akan diterapkan pada tombol yang dibuat di storyboard. Bagi saya itu bukan masalah karena saya lebih suka gaya UI dari kode. Jika Anda ingin menggunakan storyboard maka beberapa sihir tambahan dengan@IBInspectable .

Opsi kedua adalah subkelas tetapi saya lebih suka menghindari ini.

oroom
sumber
0

Mungkin Anda bisa mensubklasifikasikan tombol Anda dan mengganti variabel isEnabled Anda. Keuntungannya adalah Anda dapat menggunakan kembali di banyak tempat.

override var isEnabled: Bool {
     didSet {
         if isEnabled {
             self.alpha = 1
         } else {
             self.alpha = 0.2
         }
     }
 }
Jay Mayu
sumber
-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

sumber
2
Beberapa deskripsi yang menyertai kode Anda akan memberikan jawaban yang lebih baik.
Phantômaxx