2009-11-09 9 views
31

Ich benutze eine UIButton von benutzerdefinierten Typ und was ich will, ist es wie ein Kippschalter mit dem Wechsel des Bildes zu verwenden. Wie wenn es geklickt wird, wenn es vorher nicht im ausgewählten Modus war, sollte es in den ausgewählten Modus oder umgekehrt gehen. Es wird auch ein anderes Bild haben und wenn es ausgewählt ist, wird es ein anderes Bild haben, wenn es nicht ist.Wie benutze ich eine UIButton als Wechselschalter

Ich bin nicht in der Lage, es programmatisch zu tun, gibt es eine gute einfache Möglichkeit, dies zu tun.

+0

möglich Duplikat [iPhone UIButton mit UISwitch Funktionalität] (http://stackoverflow.com/questions/2255166/iphone-uibutton -mit-uiswitch-Funktionalität) – QED

Antwort

0

Schaltfläche ändern Bild ist keine schwierige Aufgabe. Und Sie können einen BOOL-Wert verwenden, um zu erkennen, ob sich Ihr Schalter im "ON" -Zustand befindet. und in Ihrer onBtnClk-Methode können Sie einfach den Status Ihres BOOL-Werts ändern und das Bild für den aktuellen Status festlegen.

+0

na ja, aber so ändern wir das Bild jedes Mal. Gibt es einen Weg, wo wir es nicht bei jedem Klick ändern müssen und einfach am Anfang zuweisen. – rkb

+0

Ich kann nicht verstehen, warum es so schwierig ist, das Bild zu ändern? und zu Ihrer Frage, wenn es eine Möglichkeit gibt, dieses Verhalten nur einmal zuzuweisen, weiß ich es nicht. – Morion

15

In Ihrem Header-Datei hinzufügen:

IBOutlet UIButton *toggleButton; 
BOOL toggleIsOn; 

@property (nonatomic, retain) IBOutlet UIButton *toggleButton; 

Bei der Umsetzung:

- (IBACtion)toggle:(id)sender 
{ 
    if(toggleIsOn){ 
    //do anything else you want to do. 
    } 
    else { 
    //do anything you want to do. 
    } 
    toggleIsOn = !toggleIsOn; 
    [self.toggleButton setImage:[UIImage imageNamed:toggleIsOn ? @"on.png" :@"off.png"] forState:UIControlStateNormal]; 
} 

dann verknüpfen Sie Ihre Schaltfläche mit den IBActions und der IBOutlet und initialisieren toggleIsOn auf NO.

38

Ich glaube, dieser Beitrag eine bessere Lösung hat: iPhone UIButton with UISwitch functionality

UIButton eingebaut hat Makel Es gibt eine ausgewählte Eigenschaft, die Sie festlegen können, und die Felle auf den zustandsbasierten ändern..

+9

Ignoriere alle unten aufgeführten Dinge und benutze Lees obigen Link. – Shaolo

+1

+1 mit eingebauter Funktion, einfach zu bedienen. danke – Luvie

7

In der Schnittstelle:

@interface TransportViewController : UIViewController { 

    UIButton *button; 
} 
@property(nonatomic, retain) UIButton *button; 

Bei der Umsetzung:

- (void)loadView { 

[super loadView]; 

    ... 

    [self setButton:[UIButton buttonWithType:UIButtonTypeCustom]]; 
    [button addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside]; 
    [button setImage:[UIImage imageNamed:@"image1"] forState:UIControlStateNormal]; 
    [button setImage:[UIImage imageNamed:@"image2"] forState:UIControlStateSelected]; 
} 

- (void) onClick:(UIButton *)sender { 

    [sender setSelected:!sender.selected]; 
} 
1

Das einzige Problem dabei ist, dass Sie zwei Bilder verwenden müssen Hin- und Herschalten zu erreichen. Auch können Sie nicht verwenden markiert Eigenschaft wegen UIButton (UIControl) setzt automatisch diese Eigenschaft unter der Haube, um genau zu sein in touchBegan:, touchMoved:, etc. Methoden. Die beste Weise, die ich anbieten, ist auf einfache Nutzung Subklassifizieren:

@interface ToggleButton : UIButton 

@end 

@implementation ToggleButton 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesBegan:touches withEvent:event]; 
    self.highlighted = self.selected = !self.selected; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesMoved:touches withEvent:event]; 
    self.highlighted = self.selected; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesEnded:touches withEvent:event]; 
    self.highlighted = self.selected; 
} 

- (void)setSelected:(BOOL)selected{ 
    [super setSelected:selected]; 
    self.highlighted = selected; 
} 

@end 

Dies genug ist Ihr Toggle Arbeits

-1

Ich habe diese Klasse zu machen, um die Klasse zu PGToggleButton im Interface Builder Ändern wird es tun. Es verwendet die Bilder für den Status "Standard" und "Hervorgehoben" und verfügt über eine öffentliche Eigenschaft zum Abrufen des aktuellen Status.

PGToggleButton.h

@interface PGToggleButton : UIButton 

@property (nonatomic, getter=isOn) BOOL on; 
-(void)toggle; 

@end 

PGToggleButton.m

#import "PGToggleButton.h" 


@interface PGToggleButton() 
@property (nonatomic, strong) UIImage *offStateImage; 
@property (nonatomic, strong) UIImage *onStateImage; 
-(void)touchedUpInside:(UIButton*) sender; 
@end 


@implementation PGToggleButton 
@synthesize on = _on; 
@synthesize offStateImage = _offStateImage; 
@synthesize onStateImage = _onStateImage; 

-(void)awakeFromNib 
{ 
    [super awakeFromNib]; 

    self.offStateImage = [self imageForState:UIControlStateNormal]; 
    self.onStateImage = [self imageForState:UIControlStateHighlighted]; 

    [self addTarget:self 
      action:@selector(touchedUpInside:) 
      forControlEvents:UIControlEventTouchUpInside]; 
} 

-(void)touchedUpInside:(UIButton*) sender 
{ [self toggle]; } 

-(void)toggle 
{ self.on = toggle(_on); } 

-(void)setOn:(BOOL) on 
{ 
    _on = on; 

    if (on) 
     [self setImage:self.onStateImage forState:(UIControlStateNormal)]; 
    else 
     [self setImage:self.offStateImage forState:(UIControlStateNormal)]; 
} 

@end 
+0

Oh, toggle goes BOOL toggle (BOOL boolean) {return! boolean; } – Geri

+0

Eine Hilfsfunktion, um Code lesbar zu machen ... – Geri

+0

Ich würde dies mit der eigenen State-Eigenschaft des UIButton neu schreiben. Dafür ist es da. Siehe andere Antworten. – n13

3
- (IBAction)buttonTapped:(UIButton *)sender { 


    //first time sender.selected is No 
    if (sender.selected) { 
     //code here 
     sender.selected=NO; 
    } 
    else{ 
    //code here 
     sender.selected=YES; 
    } 
} 
5

UIButton einen "Toggle" -Funktionalität standardmäßig tut unterstützt. Um dies zu verwenden, müssen Sie in Interface Builder für das State Configuration = Selected eine andere Bild- oder sogar Textfarbe festlegen und die ausgewählte Eigenschaft UIButton verwenden, um ihren Status umzuschalten.

Code:

- (IBAction)yourButtonTouch:(UIButton *)sender { 

    sender.selected = !sender.selected; 
    if (sender.selected) { 
     //... 
     // Action to be performed when button is selected or 
     // the first touch 
     // ... 

    } 
} 
1

Für Swift 3

@IBAction func playPause(sender : UIButton){ 

    sender.isSelected = !sender.isSelected 
    if sender.isSelected { 
     player.pause() 
    }else{ 
     player.play() 
    } 
}