UIButton: atur gambar untuk keadaan yang disorot terpilih

158

Saya mengatur gambar untuk status tombol Normal, Sorot dan Dipilih, tetapi ketika tombol dalam keadaan yang dipilih dan saya tekan / sorot, saya tidak melihat gambar yang saya sorot tetapi hanya gambar yang abu-abu. Apakah mungkin untuk mengatur gambar untuk keadaan yang disorot ketika tombol dipilih?

kode saya:

[button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateHighlighted];
[button setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateSelected];

ketika saya melakukannya:

[button setSelected:YES];

dan tekan tombol, gambar "pressed.png" tidak memilih.

pengguna478681
sumber
+1 Saya memiliki masalah yang sama, semoga ada jawaban.
Nick Weaver
3
Cemerlang! Siapa yang tahu Anda dapat mengatur gambar untuk kombinasi! Bekerja seperti pesona bagi saya!
David H
1
Luar Biasa !!! pertanyaanmu sendiri adalah jawaban untukku ... Berhasil !!!
Kiran S
1
Ini berfungsi untuk saya hanya dengan UIControlStateHighlighted, tapi saya panggil button.adjustsImageWhenHighlighted = NO;dulu.
Graham Perks
Ini. Jauh lebih baik daripada solusi yang saya miliki sebelumnya.
Meshach

Jawaban:

231

Saya menemukan solusinya: perlu menambahkan baris tambahan

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
pengguna478681
sumber
5
Adakah cara untuk melakukan ini melalui pembangun antarmuka?
Stephen
6
@stephen: Mengatur properti "Background" (image) dari UIButton untuk berbagai kondisi "StateConfig" (Default / Highlighted / Selected / Disabled) Properti berfungsi untuk saya.
Ajeet
2
Solusi Ajeet tidak berhasil untuk saya. Saya juga ingin tahu cara melakukannya di IB
Lucas
3
Karena Anda tidak dapat mengatur ini di IB, Anda dapat menempatkan ini dalam metode viewDidLoad Anda, dan itu akan hampir sama baiknya, karena Anda kemudian dapat mengubah gambar di IB dan tidak perlu khawatir tentang selalu memperbarui kode yang cocok. [tombol setImage: [tombol imageForState: UIControlStateHighlighted] forState: UIControlStateSelected | UIControlStateHighlighted];
Dave Wood
4
Anda dapat melakukan ini di IB. Lihat tangkapan layar di jawaban di bawah ini!
Ríomhaire
121

Anda dapat melakukan ini di Interface Builder.

Pilih yang UIButtoningin Anda atur IBlalu buka attributes inspector.

Di tangkapan layar, saya menggunakan jenis tombol kustom, tapi itu tidak masalah.

Default Kustom

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Ríomhaire
sumber
5
Kustom atau Sistem sebenarnya sangat penting. Main-main dengan keduanya dan Anda akan melihat.
Ben Sinclair
9
Tidak dalam konteks pertanyaan.
Ríomhaire
7
Ini tidak menjawab pertanyaan. Dia mengatakan kombinasi dari negara yang disorot + dipilih
Rafael Nobre
+1 karena saya benar-benar ketinggalan menu pull-down ini (saya biasa melakukan semuanya secara terprogram sampai baru-baru ini ...)
Nicolas Miari
30

Cepat 3

// Default state (previously `.Normal`)
button.setImage(UIImage(named: "image1"), for: [])

// Highlighted
button.setImage(UIImage(named: "image2"), for: .highlighted)

// Selected
button.setImage(UIImage(named: "image3"), for: .selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), for: [.selected, .highlighted])

Untuk mengatur gambar latar belakang bisa kita gunakan setBackgroundImage(_:for:)

Swift 2.x

// Normal
button.setImage(UIImage(named: "image1"), forState: .Normal)

// Highlighted
button.setImage(UIImage(named: "image2"), forState: .Highlighted)

// Selected
button.setImage(UIImage(named: "image3"), forState: .Selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), forState: [.Selected, .Highlighted])
kvothe
sumber
Versi array tidak berfungsi untuk saya. (setidaknya selama setImage)
huggie
1
iOS 10 akan meredupkan gambar normal / terpilih Anda, yang bagus dan terlihat bagus. Jika Anda mengatur gambar yang dipilih, yang disorot, itu tidak akan meredupkan yang terakhir. Yang menyebalkan.
snakeoil
28

Saya pikir sebagian besar poster di sini benar-benar ketinggalan. Saya memiliki masalah yang sama. Pertanyaan aslinya adalah tentang status Sorotan dari tombol yang Dipilih (GABUNGAN KEDUA NEGARA) yang tidak dapat diatur dalam IB dan jatuh kembali ke keadaan Default dengan beberapa penggelapan yang terjadi. Hanya solusi yang berfungsi sebagai satu posting yang disebutkan:

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
alghanor
sumber
saya tahu tetapi saya entah bagaimana tidak diizinkan
alghanor
1
untuk beberapa alasan saya masih mendapatkan masalah bahkan jika saya atur seperti di atas. Satu-satunya cara bagi saya untuk mendapatkan gambar khusus untuk kondisi kontrol saya adalah dengan mengatur UIControlStateHighlighted saja.
Julius
12

Jika Anda punya alasan kuat untuk melakukan itu, ini akan berhasil

tambahkan target ini:

[button addTarget:self action:@selector(buttonTouchDown:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(buttonTouchUp:) forControlEvents:UIControlEventTouchUpInside];


-(void)buttonTouchDown:(id)sender{
    UIButton *button=(UIButton *)sender;
    if(button.selected){
        [button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateNormal];
    }
}

-(void)buttonTouchUp:(id)sender{
    UIButton *button=(UIButton *)sender;
    [button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
}
Jorge
sumber
Terima kasih untuk ini, tetapi sebenarnya ini terlalu rumit) Saya akan berharap bahwa tombol akan bekerja seperti yang dijelaskan di atas
user478681
7

Di Swift 3.x, Anda dapat mengatur gambar yang disorot ketika tombol dipilih dengan cara berikut:

// Normal state
button.setImage(UIImage(named: "normalImage"), for: .normal) 

// Highlighted state (before button is selected)
button.setImage(UIImage(named: "pressedImage"), for: .highlighted)

// Selected state
button.setImage(UIImage(named: "selectedImage"), for:  .selected)

// Highlighted state (after button is selected)
button.setImage(UIImage(named: "pressedAfterBeingSelectedImage"), 
                for:  UIControlState.selected.union(.highlighted))
Ashish Verma
sumber
7

Dengan cepat Anda dapat melakukan:

button.setImage(UIImage(named: "selected"), 
                forState: UIControlState.selected.union(.highlighted))
Roland Keesom
sumber
2

Koreksi saya jika saya salah. Dengan melakukan

   [button setSelected:YES];

Anda dengan jelas mengubah status tombol yang dipilih. Jadi secara alami dengan kode yang Anda berikan gambar akan bahwa untuk negara yang dipilih dalam kasus Anda checked.png

visakh7
sumber
tidak sepenuhnya mengerti apa yang Anda maksud dengan "membersihkan mengubah negara ...". ini sangat sederhana: Saya mengatur gambar untuk negara-negara yang dijelaskan di atas, menambahkan target-aksi untuk tombol ini dan dalam metode yang memproses tindakan saya (mengontrol acara UIControlEventTouchUpInside) saya beralih ke keadaan yang dipilih untuk tombol [tombol setSelected: YES / NO]. Dan ketika tombol saat ini dalam keadaan yang dipilih dan saya tekan / sorot, saya hanya melihat gambar berwarna abu-abu, seperti tidak ada pengaturan gambar untuk keadaan ini.
user478681
Maksud saya jelas di sana. Maaf untuk itu. Ketika Anda menekan tombol pertama Anda mengatur statusnya sebagai yang dipilih, sehingga gambar akan ditampilkan. Jadi, jika Anda ingin mendapatkan hanya gambar yang disorot, buat statusnya seperti yang disorot. Saya tidak yakin apakah saya mendapatkan Anda dengan benar
visakh7
Ketika saya menekan tombol pertama saya menyatakannya sebagai disorot dan kemudian ketika saya melepaskannya negara akan dipilih (seperti yang saya atur dalam metode tindakan saya). Daripada saya tekan lagi (tombol sudah dalam keadaan dipilih) dan negara harus diubah untuk disorot dan saya akan melihat gambar pressed.png tetapi saya tidak melihatnya dalam kasus ini.
user478681
1

Jika seseorang bertanya-tanya bagaimana cara kerjanya di Swift, inilah solusi saya:

button.setImage("normal.png", forState: .Normal)
button.setImage("highlighted.png", forState: .Highlighted)
button.setImage("selected.png", forState: .Selected)

var selectedHighLightedStates: UIControlState = UIControlState.Highlighted
selectedHighLightedStates = selectedHighLightedStates.union(UIControlState.Selected)
button.setImage("selectedHighlighted.png", forState: selectedHighLightedStates)
berdasarkan Tuhan
sumber
@ Basegod ini adalah solusi yang berfungsi, tetapi cara Roland Keesom menulisnya jauh lebih bersih.
jungledev
1

Swift 3+

button.setImage(UIImage(named: "selected_image"), for: [.selected, .highlighted])

ATAU

button.setImage(UIImage(named: "selected_image"), for: UIControlState.selected.union(.highlighted))

Ini berarti bahwa tombol saat ini dalam selectedkeadaan, maka Anda menyentuhnya, menunjukkan highlightkeadaan.

yuanjilee
sumber
0

Saya memiliki pengaturan masalah imageView.highlighted = NO; (pengaturan YA bekerja dengan benar dan gambar berubah menjadi yang disorot).

Solusinya memanggil [imageView setHighlighted:NO];

Semuanya bekerja dengan baik.

DrArt
sumber
0

Dari mana Anda ingin menelepon

[button addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];

Metode:

-(void)test:(id)sender{
    UIButton *button=(UIButton *)sender;
    if (_togon){
      [button setTitleColor:UIColorFromRGB(89,89, 89) forState:UIControlStateNormal];
      _togon=NO;
    }
    else{
      [button setTitleColor:UIColorFromRGB(28, 154, 214) forState:UIControlStateNormal];
      _togon=YES;
    }
}

Kredit di atas untuk Jorge tetapi saya sedikit meningkatkannya memberikan solusi kerja penuh

Kingsley Mitchell
sumber
0

Xamarin C #

Melakukan bitwise ATAU tidak bekerja karena suatu alasan

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected | UIControlState.Highlighted | UIControlState.Focused);

Pekerjaan berikut

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Highlighted);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Focused);
Pierre
sumber
0

Jika Anda memerlukan warna yang disorot yang disediakan oleh OS secara default ketika Anda mengetuk dan menahan tombol kustom untuk kondisi yang dipilih juga, gunakan subkelas UIButton ini. Ditulis dalam Swift 5:

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            if (self.isSelected != isHighlighted) {
                self.isHighlighted = self.isSelected
            }
        }
    }
}
Raj Pawan Gumdal
sumber