UIButton: seçilen vurgulanan durum için resmi ayarla


158

Düğme durumları için görüntüleri Normal, Vurgulanan ve Seçili olarak ayarladım, ancak seçili durumdaki düğme ve düğmesine bastığımda vurgulanan görüntümü görmedim, sadece gri renkli resmi gördüm. Düğme seçildiğinde vurgulanan durum için bir görüntü ayarlamak mümkün müdür?

kodum:

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

ben yaparken:

[button setSelected:YES];

düğmesine basın, "pressed.png" resmi seçilmez.


+1 Aynı problemim var, umarım cevaplar olur.
Nick Weaver

3
Parlak! Kombinasyonlar için görüntüler ayarlayabileceğinizi kim bilebilir ki! Benim için bir cazibe gibi çalıştı!
David H

1
Müthiş !!! Sorunun kendisi benim için cevap ... İşe yaradı !!!
Kiran S

1
Benim için sadece UIControlStateHighlighted ile çalışıyor, ama önce çağırıyorum button.adjustsImageWhenHighlighted = NO;.
Graham Perks

Bu. Daha önce sahip olduğum çözümden çok daha iyi.
Meshach

Yanıtlar:


231

Çözümü buldum: ekleme satırı eklemeliyim

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

5
Arayüz oluşturucu ile bunu yapmanın herhangi bir yolu var mı?
Stephen

6
@stephen: "StateConfig" (Varsayılan / Vurgulanan / Seçili / Devre Dışı) Özelliğinin farklı koşulları için UIButton'un "Arka Plan" (görüntü) özelliğini ayarlamak benim için çalışır.
Ajeet

2
Ajeet'in çözümü benim için işe yaramadı. Ayrıca bunu IB'de yapmanın bir yolunu da bilmek istiyorum
Lucas

3
Bunu IB'de ayarlayamadığınız için, bunu viewDidLoad yönteminize koyabilirsiniz ve daha sonra iyi olacaktır, çünkü daha sonra IB'deki görüntüyü değiştirebilir ve kodun her zaman eşleşecek şekilde güncellenmesi konusunda endişelenmenize gerek yoktur. [button setImage: [düğme imageForState: UIControlStateHighlighted] forState: UIControlStateSelected | ] UIControlStateHighlighted;
Dave Wood

4
Sen Can IB bunu. Aşağıdaki cevaptaki ekran görüntülerine bakın!
Ríomhaire

121

Bunu Interface Builder'da yapabilirsiniz.

UIButtonAyarlamak istediğinizi seçin ve IBöğesine gidin attributes inspector.

Ekran çekimlerinde, özel bir düğme türü kullanıyorum, ancak bu önemli değil .

Özel varsayılan

resim açıklamasını buraya girin

resim açıklamasını buraya girin


5
Özel veya Sistem aslında çok önemlidir. Her ikisiyle de oynayın ve göreceksiniz.
Ben Sinclair

9
Soru bağlamında değil.
Ríomhaire

7
Bu soruya cevap vermiyor. Vurgulanan + seçilen durumun kombinasyonunu söylüyor
Rafael Nobre

+1 çünkü bu aşağı açılan menüleri tamamen kaçırdım (oldukça yakın zamana kadar her şeyi programlı olarak yapardım ...)
Nicolas Miari

30

Hızlı 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])

Arka plan resmini ayarlamak için 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])

Dizi sürümü benim için çalışmadı. (en azından sırasında setImage)
huggie

1
iOS 10, normal / seçili görüntülerinizi karartır, bu da hoş ve güzel görünür. Seçilen, vurgulanan bir görüntüyü ayarlarsanız, görüntüyü otomatik olarak karartmaz. Bu bir serseri.
snakeoil

28

Bence buradaki posterlerin çoğu bu noktayı tamamen kaçırıyor. Ben de aynı problemi yaşadım. Orijinal soru, IB'de ayarlanamayan ve bazı kararmalar devam ederken Varsayılan duruma geri dönen Seçili bir düğmenin Vurgulanan durumu (HEM DEVLETLERİN KOMBİNASYONU) hakkındaydı. Bahsedilen bir gönderi olarak sadece çalışma çözümü:

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

biliyorum ama bir şekilde izin verilmedi
alghanor

1
bir nedenden dolayı yukarıdaki gibi ayarlasam da sorunu hala alıyorum. Benim kontrol durumum için özel bir görüntü elde etmenin tek yolu sadece UIControlStateHighlighted ayarlamaktır.
Julius

12

Bunu yapmak için iyi bir nedeniniz varsa, bu hile yapacaktır

şu hedefleri ekleyin:

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

Bunun için teşekkürler, ama aslında çok karmaşık) Düğmenin yukarıda açıklandığı gibi çalışacağını
bekleyeceğim

7

Swift 3.x'te, düğme aşağıdaki şekilde seçildiğinde vurgulanan görüntüyü ayarlayabilirsiniz:

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

Hızlı bir şekilde şunları yapabilirsiniz:

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

2

Eğer Yanlışsam beni düzelt. Yaparak

   [button setSelected:YES];

düğmelerin durumunu seçildiği gibi açıkça değiştiriyorsunuz. Doğal olarak, sağladığınız kod ile görüntü, durumunuzdaki seçilen durum için kontrol edilir.


"devleti değiştirerek ..." derken ne demek istediğini tam olarak anlamadım. bu çok basit: Yukarıda açıklanan durumlar için görüntüleri ayarladım, bu düğme için hedef eylemi ekledim ve eylemimi işleyen yöntemde (control event UIControlEventTouchUpInside) Düğme için seçilen durumu değiştiririm [button setSelected: YES / NO]. Düğme şu anda seçili durumdayken ve düğmesine bastığımda / vurguladığımda, bu durum için görüntü ayarı olmadığı gibi yalnızca gri görüntü görüyorum.
user478681

Açıkça orada demek istedim. Bunun için özür dilerim. Önce düğmeye bastığınızda, durumunu seçildiği gibi ayarlarsınız, böylece görüntü görüntülenir. Bu nedenle, yalnızca vurgulanan görüntüyü almak istiyorsanız durumunu vurgulayın. Seni düzgün alıyorsam emin değilim
visakh7

Düğmeye ilk bastığımda, vurgulanmış olarak belirtirim ve ardından bıraktığımda durum seçilir (eylem yöntemimde ayarladığım gibi). Tekrar bastığımda (düğme zaten seçilmiş durumda) ve durum vurgulanmış olarak değiştirilmeli ve pressed.png görüntüsünü görmeliyim ama bu durumda görmüyorum.
user478681

1

Birisi Swift'te nasıl çalıştığını merak ediyorsa, işte benim çözümüm:

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 bu çalışan bir çözüm, ancak Roland Keesom'un yazdığı gibi çok daha temiz.
jungledev

1

Hızlı 3+

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

VEYA

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

Bu düğme geçerli selecteddurumda, daha sonra dokunursanız, highlightdurumu gösterir anlamına gelir .


0

Sorun ayarı vardı imageView.highlighted = NO; ( EVET ayarı düzgün çalıştı ve görüntü vurgulanan bir değişti).

Çözüm çağırıyordu [imageView setHighlighted:NO];

Her şey düzgün çalıştı.


0

Nereden aramak istersiniz

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

Yöntem:

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

Jorge'nin üzerinde kredi ama tam çalışma çözümü vererek biraz geliştirdim


0

Xamarin C #

Bitsel VEYA yapmak bir nedenden dolayı çalışmıyor

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

Aşağıdaki işler

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

Seçilen durum için de özel bir düğmeyi basılı tuttuğunuzda işletim sisteminin varsayılan olarak sağladığı vurgulanmış renk tonuna ihtiyacınız varsa, bu UIButton alt sınıfını kullanın. Swift 5'de yazıldı:

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            if (self.isSelected != isHighlighted) {
                self.isHighlighted = self.isSelected
            }
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.