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.


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

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


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

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

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

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

7

Dengan cepat Anda dapat melakukan:

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

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


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)

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


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.


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


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

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