UIButton: ustaw obraz dla wybranego stanu podświetlenia

158

Ustawiam obrazy dla stanów przycisku Normalny, Podświetlony i Wybrany, ale gdy przycisk jest w stanie zaznaczonym i naciskam / podświetlam go, nie widziałem podświetlonego obrazu, ale tylko wyszarzony obraz. Czy można ustawić obraz dla stanu podświetlenia po wybraniu przycisku?

mój kod:

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

kiedy robię:

[button setSelected:YES];

i naciśnij przycisk, obraz „press.png” nie zostanie wybrany.

user478681
źródło
+1 Mam ten sam problem, mam nadzieję, że będą odpowiedzi.
Nick Weaver
3
Znakomity! Kto by wiedział, że możesz ustawić obrazy dla kombinacji! U mnie zadziałało jak urok!
David H,
1
Niesamowite!!! Twoje pytanie jest dla mnie odpowiedzią ... Udało się !!!
Kiran S
1
Działa dla mnie tylko z podświetlonym UIControlStateHighlight, ale button.adjustsImageWhenHighlighted = NO;najpierw dzwonię .
Graham Perks
To. O wiele lepsze niż rozwiązanie, które miałem wcześniej.
Meshach

Odpowiedzi:

231

Znalazłem rozwiązanie: trzeba dodać linię dodawania

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
user478681
źródło
5
Jakiś sposób, aby to zrobić za pomocą narzędzia do tworzenia interfejsów?
Stephen
6
@stephen: Ustawienie właściwości "Tło" (obraz) UIButton dla różnych warunków właściwości "StateConfig" (Domyślne / Podświetlone / Wybrane / Wyłączone) działa dla mnie.
Ajeet
2
Rozwiązanie Ajeet nie działało dla mnie. Chciałbym również wiedzieć, jak to zrobić na IB
Lucas
3
Ponieważ nie możesz tego ustawić w IB, możesz umieścić to w swojej metodzie viewDidLoad i będzie prawie tak samo dobre, ponieważ możesz wtedy zmienić obraz w IB i nie musisz się martwić o zawsze aktualizowanie kodu, aby pasował. [button setImage: [button imageForState: UIControlStateHighlighted] forState: UIControlStateSelected | UIControlStateHighlighted];
Dave Wood
4
Możesz to zrobić w IB. Zobacz zrzuty ekranu w poniższej odpowiedzi!
Ríomhaire,
121

Możesz to zrobić w programie Interface Builder.

Wybierz opcję, UIButtonktórą chcesz ustawić, IBa następnie przejdź do attributes inspector.

Na zrzutach ekranu używam niestandardowego typu przycisku, ale to nie ma znaczenia.

Niestandardowe ustawienie domyślne

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Ríomhaire
źródło
5
Niestandardowy lub system ma tak naprawdę duże znaczenie. Pobaw się z oboma, a zobaczysz.
Ben Sinclair
9
Nie w kontekście pytania.
Ríomhaire
7
To nie odpowiada na pytanie. Mówi, że połączenie stanu podświetlonego + wybranego
Rafael Nobre
+1, ponieważ całkowicie przegapiłem te rozwijane menu (robiłem wszystko programowo do niedawna ...)
Nicolas Miari
30

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

Aby ustawić obraz tła, możemy użyć 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
źródło
Wersja tablicowa nie działała dla mnie. (przynajmniej w trakcie setImage)
huggie
1
iOS 10 przyciemni twoje normalne / wybrane obrazy, co jest ładne i ładnie wygląda. Jeśli ustawisz wybrany, podświetlony obraz, nie będzie on automatycznie przyciemniany. Co jest kłopotliwe.
Snakeoil
28

Myślę, że większość plakatów całkowicie mija się z celem. Miałem ten sam problem. Pierwotne pytanie dotyczyło stanu podświetlenia wybranego przycisku (ŁĄCZENIE OBU STANÓW), którego nie można ustawić w IB i który wraca do stanu domyślnego z pewnym przyciemnieniem. Jedyne działające rozwiązanie, jak wspomniał jeden post:

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
alghanor
źródło
Wiem, ale jakoś mi nie pozwolono
alghanor
1
z jakiegoś powodu nadal mam problem, nawet jeśli ustawię go jak powyżej. Jedynym sposobem uzyskania niestandardowego obrazu dla mojego stanu kontroli jest ustawienie tylko UIControlStateHighlighted.
Julius
12

Jeśli masz ku temu dobry powód, to załatwi sprawę

dodaj te cele:

[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
źródło
Dziękuję za to, ale w rzeczywistości jest to zbyt skomplikowane) Spodziewam się, że przycisk będzie działał jak opisano powyżej
user478681
7

W Swift 3.x możesz ustawić podświetlony obraz po wybraniu przycisku w następujący sposób:

// 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
źródło
7

Szybko możesz:

button.setImage(UIImage(named: "selected"), 
                forState: UIControlState.selected.union(.highlighted))
Roland Keesom
źródło
2

Popraw mnie, jeśli się mylę. Wykonując

   [button setSelected:YES];

wyraźnie zmieniasz stan wybranych przycisków. Więc naturalnie przez kod, który podałeś, obraz będzie dla wybranego stanu w twoim przypadku check.png

visakh7
źródło
nie do końca rozumiem, co masz na myśli, mówiąc „oczyszczenie zmieniając stan…”. to jest bardzo proste: ustawiam obrazy dla stanów opisanych powyżej, dodaję akcję docelową dla tego przycisku oraz w metodzie przetwarzającej moją akcję (zdarzenie sterujące UIControlEventTouchUpInside) przełączam wybrany stan dla przycisku [button setSelected: YES / NO]. A kiedy przycisk jest obecnie w wybranym stanie i naciskam / podświetlam go, widzę tylko wyszarzony obraz, jakby nie było ustawień obrazu dla tego stanu.
user478681
Miałem na myśli jasno. Przepraszam za to. Po pierwszym naciśnięciu przycisku ustawiasz jego stan jako wybrany, tak aby obraz został wyświetlony. Więc jeśli chcesz mieć tylko podświetlony obraz, ustaw jego stan jako podświetlony. Nie jestem jednak pewien, czy dobrze cię
rozumiem
Kiedy najpierw naciskam przycisk, określam go jako podświetlony, a gdy go puszczam, stan zostanie wybrany (tak jak ustawiłem w mojej metodzie akcji). Następnie wciskam go ponownie (przycisk już w stanie zaznaczonym) i stan powinien zostać zmieniony na podświetlony i powinienem zobaczyć obraz press.png, ale w tym przypadku go nie widzę.
user478681
1

Jeśli ktoś się zastanawia, jak to działa w Swift, oto moje rozwiązanie:

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)
basedgod
źródło
@basegod to działające rozwiązanie, ale sposób, w jaki Roland Keesom to napisał, jest znacznie czystszy.
jungledev
1

Swift 3+

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

LUB

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

Oznacza to, że przycisk jest w aktualnym selectedstanie, a następnie go dotkniesz, pokaż highlightstan.

yuanjilee
źródło
0

Miałem problem z ustawieniem imageView.highlighted = NO; (ustawienie TAK działało poprawnie i obraz zmienił się na podświetlony).

Rozwiązanie zadzwoniło [imageView setHighlighted:NO];

Wszystko działało poprawnie.

DrArt
źródło
0

Skąd chcesz dzwonić

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

Metoda:

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

Powyższe uznanie dla Jorge, ale poprawiłem to trochę, dając pełne działające rozwiązanie

Kingsley Mitchell
źródło
0

Xamarin C #

Wykonywanie bitowego OR nie działa z jakiegoś powodu

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

Następujące prace

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
źródło
0

Jeśli potrzebujesz podświetlonego odcienia, który system operacyjny zapewnia domyślnie po dotknięciu i przytrzymaniu przycisku niestandardowego dla wybranego stanu, użyj tej podklasy UIButton. Napisane w 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
źródło