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?


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;

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


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.


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.


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

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];

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

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


5

Dalam Swift :

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

atau

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0

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


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

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.


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

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


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


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

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.


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

-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
Beberapa deskripsi yang menyertai kode Anda akan memberikan jawaban yang lebih baik.
Phantômaxx
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.