Come utilizzare un UIButton come interruttore a levetta

Sto usando un UIButton di tipo personalizzato e quello che voglio è usarlo come un interruttore a levetta con il cambio di immagine. Come quando viene cliccato se in precedenza non era in modalità selezionata dovrebbe andare in modalità selezionata o viceversa. Inoltre avrà un’immagine diversa e quando sarà selezionata avrà un’immagine diversa quando non lo è.

Non sono in grado di farlo in modo programmatico, c’è un buon modo semplice per farlo.

Credo che questo post abbia una soluzione migliore: iPhone UIButton con funzionalità UISwitch

UIButton ha triggersto la conversione. C’è una proprietà selezionata che è ansible impostare e modificare le skin in base allo stato.

Nel tuo file di intestazione aggiungi:

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

Nell’implementazione:

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

quindi colbind il pulsante con IBActions e IBOutlet e inizializzare toggleIsOn su NO.

Nell’interfaccia:

 @interface TransportViewController : UIViewController { UIButton *button; } @property(nonatomic, retain) UIButton *button; 

Nell’implementazione:

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

UIButton supporta una funzionalità di “commutazione” per impostazione predefinita. Per utilizzarlo è necessario impostare un’immagine diversa o il colore del testo in Interface Builder per State Configuration = Selected , e utilizzare la proprietà selezionata di UIButton per commutare il suo stato.

Codice:

 - (IBAction)yourButtonTouch:(UIButton *)sender { sender.selected = !sender.selected; if (sender.selected) { //... // Action to be performsd when button is selected or // the first touch // ... } } 
 - (IBAction)buttonTapped:(UIButton *)sender { //first time sender.selected is No if (sender.selected) { //code here sender.selected=NO; } else{ //code here sender.selected=YES; } } 

Per Swift 3

 @IBAction func playPause(sender : UIButton){ if sender.isSelected { player.pause() }else{ player.play() } sender.isSelected = !sender.isSelected } 

L’unico problema qui è che devi usare 2 immagini per ottenere la commutazione. Inoltre non è ansible utilizzare la proprietà evidenziata a causa di UIButton (UIControl) imposta automaticamente questa proprietà sotto il cofano, per essere precisi nei metodi touchBegan:, touchMoved:, ecc. Il modo migliore che offro è una sottoclass semplice da usare:

 @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 

Questo è abbastanza per far funzionare il tuo interruttore

Modificare l’immagine del pulsante non è un compito difficile. E puoi usare qualche valore BOOL per rilevare se il tuo pulsante di accensione è nello stato “ON”. e nel tuo metodo onBtnClk puoi semplicemente modificare lo stato del tuo valore BOOL e impostare l’immagine per lo stato corrente.

Ho creato questa class, cambiando la class in PGToggleButton nel builder dell’Interfaccia lo farò. Utilizza le immagini per lo stato Predefinito e Evidenziato e ha una proprietà pubblica per ottenere / impostare lo stato attuale.

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