UIButton: Bild für ausgewählten hervorgehobenen Zustand einstellen

158

Ich habe Bilder für die Schaltflächenzustände Normal, Hervorgehoben und Ausgewählt festgelegt. Wenn sich die Schaltfläche jedoch im ausgewählten Zustand befindet und ich sie drücke / hervorhebe, wird mein hervorgehobenes Bild nicht angezeigt, sondern nur ein graues Bild. Ist es möglich, ein Bild für den hervorgehobenen Zustand festzulegen, wenn die Schaltfläche ausgewählt ist?

Mein Code:

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

wenn ich es tue:

[button setSelected:YES];

und drücken Sie die Taste, das Bild "press.png" wird nicht ausgewählt.

user478681
quelle
+1 Ich habe das gleiche Problem, hoffe es gibt Antworten.
Nick Weaver
3
Brillant! Wer würde jemals wissen, dass Sie Bilder für Kombinationen festlegen können! Arbeitete wie ein Zauber für mich!
David H
1
Genial!!! Ihre Frage selbst ist eine Antwort für mich ... Es hat funktioniert !!!
Kiran S
1
Es funktioniert für mich nur mit UIControlStateHighlighted, aber ich rufe button.adjustsImageWhenHighlighted = NO;zuerst an.
Graham Perks
Dies. So viel besser als die Lösung, die ich vorher hatte.
Meshach

Antworten:

231

Ich habe die Lösung gefunden: Additionszeile hinzufügen

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
user478681
quelle
5
Gibt es eine Möglichkeit, dies über den Interface Builder zu tun?
Stephen
6
@stephen: Das Festlegen der Eigenschaft "Hintergrund" (Bild) von UIButton für verschiedene Bedingungen der Eigenschaft "StateConfig" (Standard / Hervorgehoben / Ausgewählt / Deaktiviert) funktioniert für mich.
Ajeet
2
Ajeets Lösung hat bei mir nicht funktioniert. Ich würde auch gerne wissen, wie man das auf IB macht
Lucas
3
Da Sie dies nicht in IB festlegen können, können Sie dies in Ihre viewDidLoad-Methode einfügen. Dies ist fast genauso gut, da Sie das Bild in IB ändern können und sich nicht darum kümmern müssen, den Code immer entsprechend zu aktualisieren. [button setImage: [button imageForState: UIControlStateHighlighted] forState: UIControlStateSelected | UIControlStateHighlighted];
Dave Wood
4
Sie können dies in IB tun. Siehe Screenshots in der Antwort unten!
Ríomhaire
121

Sie können dies im Interface Builder tun.

Wählen UIButtonSie das aus, das Sie einstellen möchten, IBund gehen Sie dann zu attributes inspector.

In den Screenshots verwende ich einen benutzerdefinierten Schaltflächentyp, aber das spielt keine Rolle.

Benutzerdefinierte Standardeinstellung

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Ríomhaire
quelle
5
Benutzerdefiniert oder System ist eigentlich sehr wichtig. Spielen Sie mit beiden herum und Sie werden sehen.
Ben Sinclair
9
Nicht im Zusammenhang mit der Frage.
Ríomhaire
7
Dies beantwortet die Frage nicht. Er sagt, die Kombination von hervorgehobenem + ausgewähltem Zustand
Rafael Nobre
+1, weil ich diese Pulldown-Menüs total verpasst habe (ich habe bis vor kurzem alles programmgesteuert gemacht ...)
Nicolas Miari
29

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

Um das Hintergrundbild einzustellen, können wir verwenden 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
quelle
Die Array-Version hat bei mir nicht funktioniert. (zumindest während setImage)
Huggie
1
iOS 10 wird Ihre normalen / ausgewählten Bilder dimmen, was schön ist und gut aussieht. Wenn Sie ein ausgewähltes, hervorgehobenes Bild festlegen, wird letzteres nicht automatisch gedimmt. Welches ist ein Mist.
Schlangenöl
28

Ich denke, die meisten Poster hier verfehlen den Punkt völlig. Ich hatte das gleiche Problem. Die ursprüngliche Frage betraf den hervorgehobenen Status einer ausgewählten Schaltfläche (KOMBINIEREN BEIDER STAATEN), die in IB nicht eingestellt werden kann und bei einigen Verdunkelungen auf den Standardstatus zurückfällt. Nur funktionierende Lösung als ein Beitrag erwähnt:

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
alghanor
quelle
Ich weiß, aber ich war irgendwie nicht erlaubt
Afghanistan
1
Aus irgendeinem Grund bekomme ich das Problem immer noch, auch wenn ich es wie oben eingestellt habe. Die einzige Möglichkeit für mich, ein benutzerdefiniertes Image für meinen Steuerungsstatus zu erhalten, besteht darin, nur UIControlStateHighlighted festzulegen.
Julius
12

Wenn Sie einen guten Grund dafür haben, reicht dies aus

Fügen Sie diese Ziele hinzu:

[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
quelle
Vielen Dank dafür, aber eigentlich ist es zu kompliziert.) Ich gehe davon aus, dass die Schaltfläche wie oben beschrieben
funktioniert
7

In Swift 3.x können Sie das hervorgehobene Bild festlegen, wenn die Schaltfläche folgendermaßen ausgewählt ist:

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

In Kürze können Sie Folgendes tun:

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

Korrigieren Sie mich, wenn ich falsch liege. Indem ich es tue

   [button setSelected:YES];

Sie ändern eindeutig den Status der Schaltflächen wie ausgewählt. Nach dem von Ihnen angegebenen Code wird das Bild natürlich für den ausgewählten Status in Ihrem Fall geprüft

visakh7
quelle
Ich verstehe nicht ganz, was du mit "Clearing Change the State ..." meinst. Dies ist sehr einfach: Ich setze die Bilder für die oben beschriebenen Zustände, füge eine Zielaktion für diese Schaltfläche hinzu und schalte in einer Methode, die meine Aktion verarbeitet (Steuerereignis UIControlEventTouchUpInside), den ausgewählten Status für die Schaltfläche um [Schaltfläche setSelected: YES / NO]. Und wenn sich die Schaltfläche derzeit im ausgewählten Status befindet und ich sie drücke / hervorhole, wird nur ein graues Bild angezeigt, als ob für diesen Status kein Bild eingerichtet worden wäre.
user478681
Ich meinte klar da. Das tut mir leid. Wenn Sie zuerst die Taste drücken, stellen Sie den Status als ausgewählt ein, sodass das Bild angezeigt wird. Wenn Sie also nur ein hervorgehobenes Bild erhalten möchten, stellen Sie den Status als hervorgehoben ein. Ich bin mir jedoch nicht sicher, ob ich dich richtig
bekomme
Wenn ich die Taste zuerst drücke, erkläre ich sie als hervorgehoben und wenn ich sie loslasse, wird der Zustand ausgewählt (wie ich ihn in meiner Aktionsmethode festgelegt habe). Dann drücke ich es erneut (Schaltfläche bereits im ausgewählten Zustand) und der Zustand sollte in hervorgehoben geändert werden und ich sollte das Bild press.png sehen, aber ich sehe es in diesem Fall nicht.
user478681
1

Wenn sich jemand fragt, wie das in Swift funktioniert, ist hier meine Lösung:

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
quelle
@basegod das ist eine funktionierende Lösung, aber die Art, wie Roland Keesom sie schrieb, ist viel sauberer.
Jungledev
1

Swift 3+

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

ODER

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

Dies bedeutet, dass die Schaltfläche im aktuellen selectedStatus angezeigt wird. Wenn Sie sie berühren, wird der highlightStatus angezeigt.

Yuanjilee
quelle
0

Ich hatte Probleme beim Einstellen imageView.highlighted = NO; (die Einstellung JA funktionierte ordnungsgemäß und das Bild wurde in das hervorgehobene geändert).

Die Lösung rief an [imageView setHighlighted:NO];

Alles hat richtig funktioniert.

DrArt
quelle
0

Woher möchten Sie anrufen?

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

Die Methode:

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

Dank an Jorge, aber ich habe es ein bisschen verbessert, um die voll funktionsfähige Lösung zu erhalten

Kingsley Mitchell
quelle
0

Xamarin C #

Bitweise ODER zu tun funktioniert aus irgendeinem Grund nicht

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

Folgendes funktioniert

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
quelle
0

Verwenden Sie diese UIButton-Unterklasse, wenn Sie den hervorgehobenen Farbton benötigen, den das Betriebssystem standardmäßig bereitstellt, wenn Sie auf eine benutzerdefinierte Schaltfläche für den ausgewählten Status tippen und diese gedrückt halten. Geschrieben in 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
quelle