2009-11-09 11 views
31

Estoy usando un UIButton de tipo personalizado y lo que quiero es usarlo como un interruptor con el cambio de imagen. Al igual que cuando se hace clic en él, si anteriormente no estaba en el modo seleccionado, debería ir en modo seleccionado o viceversa. También tendrá una imagen diferente y cuando se seleccione tendrá una imagen diferente cuando no lo esté.Cómo utilizar un UIButton como un interruptor de palanca

No puedo hacerlo programáticamente, ¿hay alguna manera fácil y sencilla de hacerlo?

+0

posible duplicado de [iPhone UIButton con funcionalidad UISwitch] (http://stackoverflow.com/questions/2255166/iphone-uibutton -with-uiswitch-functional) – QED

Respuesta

0

Cambiar la imagen del botón no es una tarea difícil. Y puede usar algún valor BOOL para detectar si su botón de conmutación está en el estado "ON". y en su método onBtnClk puede simplemente cambiar el estado de su valor BOOL y establecer la imagen para el estado actual.

+0

bueno, sí, pero de esta manera estamos cambiando la imagen todo el tiempo. ¿Hay alguna forma en que no tengamos que cambiarlo en cada clic y simplemente asignarlo al comienzo? – rkb

+0

No puedo entender por qué es tan difícil cambiar la imagen? y a su pregunta, si hay alguna forma de asignar este comportamiento solo una vez, no lo sé. – Morion

15

En el archivo de cabecera complemento:

IBOutlet UIButton *toggleButton; 
BOOL toggleIsOn; 

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

En la implementación:

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

luego enlazar su botón con las IBActions y la IBOutlet e inicializar toggleIsOn a NO.

38

creo que este post tiene una mejor solución: iPhone UIButton with UISwitch functionality

UIButton ha construido en alternar Hay una propiedad seleccionada que puede establecer y cambiar los skins basado en el estado..

+9

Ignora todas las cosas a continuación y usa el enlace de Lee arriba. – Shaolo

+1

+1 usando la función incorporada, fácil de usar. gracias – Luvie

7

En la interfaz:

@interface TransportViewController : UIViewController { 

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

En la implementación:

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

El único problema aquí es que usted tiene que utilizar 2 imágenes para lograr alternancia. Tampoco puede usar propiedad destacada debido a UIButton (UIControl) establece automáticamente esta propiedad debajo del capó, para ser exactos en touchBegan:, touchMoved:, etc. métodos. La mejor manera que ofrezco es sencilla de subclases uso:

@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 

Esto es más que suficiente para hacer su trabajo de palanca

-1

hice esta clase, el cambio de la clase a PGToggleButton en el constructor Interfaz lo hará. Utiliza las imágenes para estado Predeterminado y Destacado, y tiene una propiedad pública para obtener/establecer el estado real.

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, alternar va BOOL alternar (BOOL booleano) {return! boolean; } – Geri

+0

Una función de ayuda para hacer que el código sea legible ... – Geri

+0

Lo volvería a escribir utilizando la propiedad de estado de UIButton. Esto es para lo que sirve. Ver otras respuestas – 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 hace compatible con una "palanca" funcionalidad por defecto. Para usar esto, necesita establecer una imagen diferente o incluso color de texto en el Interface Builder para el State Configuration = Selected, y usar la propiedad seleccionada de UIButton para alternar su estado.

Código:

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

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

    } 
} 
1

Para Swift 3

@IBAction func playPause(sender : UIButton){ 

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