2009-07-02 8 views
35

Quiero cambiar la imagen en UIButton, cuando el usuario presiona ese botón. Entonces, escribíCambiar la imagen en UIButton cuando el usuario presiona ese botón en un iPhone

btnthumbnail2 setImage:[UIImage imageNamed:@"leaderboard_ov.png"] forState:UIControlStateNormal]; 

y después de eso cambié la vista.

La imagen está cambiando pero no muestra la imagen modificada. Creo que el control pasa a la siguiente vista y es por eso que está sucediendo. Pero quiero mostrar el cambio, ¿cómo puedo hacer esto? Por favor, ayúdeme para esto ..

+1

¿Quiere decir que después de presionarlo, quiere que cambie el estado? o mientras están presionando el botón? – John

+0

Sí después de presionarlo, la imagen debe cambiarse. –

Respuesta

5

Para cambiar la imagen para el estado seleccionado, tiene que llamar al setImage para el estado UIControlStateSelected. Puede establecer imágenes separadas para diferentes estados (Normal, Destacado, Inhabilitado, Seleccionado, etc.).

11

El código que tiene allí debería funcionar bien, pero supongo que la imagen del botón no aparecerá modificada hasta la próxima ejecución del bucle de evento, por lo que no la verá antes de que la vista se desconecte.

Es un truco, pero podrías intentar retrasar el cambio de la vista ligeramente para que el botón se actualice.

Así que en lugar de esto:

[btnthumbnail2 setImage:[UIImage imageNamed:@"leaderboard_ov.png"] forState:UIControlStateNormal]; 
[self showMyOtherView]; 

Prueba esto:

[btnthumbnail2 setImage:[UIImage imageNamed:@"leaderboard_ov.png"] forState:UIControlStateNormal]; 
[self performSelector:@selector(showMyOtherView) withObject:self afterDelay:0.01]; 
+0

gracias Está funcionando ... –

1

que escribió el código que hace exactamente esta última noche, y yo no tenga que recurrir a cualquier táctica dilatoria extraños. En este caso particular, lo estoy haciendo desde dentro de tableViewCell. Esto es más código de lo que pediste, pero muestra todo el proceso que utilicé. Como puede ver, elegí no tener ninguna imagen especial durante el período DURANTE un toque del botón.

// Button set up, inside cellForRowAtIndexPath: 
// imageFrame is just the rect that you want the button to occupy 
    [self setFavorite:[[UIButton alloc] initWithFrame:imageFrame]]; 
    [[self favorite] addTarget:self action:@selector(toggleFavorite:) 
     forControlEvents:UIControlEventTouchUpInside]; 
    [cell addSubview:[self favorite]]; 
    [self draw]; 


// definition of the callback specified above 
- (void) toggleFavorite:(id) sender { 
    if (favoriteState == 0){ 
    favoriteState = 1; 
    } else { 
    favoriteState = 0; 
    } 
    [self draw]; 
} 

// the draw method, to set the images 
// favOn and favOff are statically defined at the top of the class 
- (void) draw { 
    if (favoriteState != 0) { 
    [[self favorite] setBackgroundImage:favOn forState:UIControlStateNormal]; 
    [[self favorite] setBackgroundImage:favOn forState:UIControlStateHighlighted]; 
    } else { 
    [[self favorite] setBackgroundImage:favOff forState:UIControlStateNormal]; 
    [[self favorite] setBackgroundImage:favOff forState:UIControlStateHighlighted]; 
    } 
} 
92

Estoy utilizando Interface Builder, en el que agregué un UIButton a la vista.

  1. que define el botón seleccionado por defecto y selecciona mi imagen para el estado seleccionado (Utilice la lista desplegable en la ventana de inspección para elegir "seleccionada Configuración Estado" antes de seleccionar la imagen).

  2. Cree un IBAction en el controlador y conecte el botón a esa acción.

  3. A continuación, ver el código de abajo:

-(IBAction) toggleUIButtonImage:(id)sender{ 
     if ([sender isSelected]) { 
     [sender setImage:unselectedImage forState:UIControlStateNormal]; 
     [sender setSelected:NO]; 
     } else { 
     [sender setImage:selectedImage forState:UIControlStateSelected]; 
     [sender setSelected:YES]; 
     } 
    } 

Creo que esta es una solución muy suave. ¡Espero eso ayude!

+0

gracias nicsoft, ¡esto me ayudó a descubrir una pieza del rompecabezas! – iwasrobbed

+0

¡Eres el hombre! gracias por el código me ayuda a resolver mi problema :) –

+0

Esta es la forma correcta de hacer esto. –

2

La forma más sencilla de lograr esto es simplemente establecer la imagen resaltada en el Interface Builder.

+0

¡Eso es lo que pensé! – user1432813

+0

¿No sería eso solo mostrar la imagen resaltada por un instante y luego volver al original? – hanumanDev

+0

Después de 2 horas de desperdicio, acabo de resaltar y funciona como un encanto. ¡Gracias, héroe! –

2

Basado en la respuesta de Nicsoft.

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.button setImage:[UIImage imageNamed:@"unselectedImageName"] forState:UIControlStateNormal]; 
    [self.button setImage:[UIImage imageNamed:@"selectedImageName"] forState:UIControlStateSelected]; 
} 

-(IBAction)toggleButton:(UIButton *)sender { 
    sender.selected = !sender.selected; 
    // Add logic here 
} 
19

Esta es la forma más sencilla de que lo estoy haciendo y funciona cada vez que

-(void)buttonTouched:(id)sender 
{ 
UIButton *btn = (UIButton *)sender; 

if([[btn imageForState:UIControlStateNormal] isEqual:[UIImage imageNamed:@"icon-Locked.png"]]) 
    { 
     [btn setImage:[UIImage imageNamed:@"icon-Unlocked.png"] forState:UIControlStateNormal]; 
     // other statements 
    } 
else 
    { 
     [btn setImage:[UIImage imageNamed:@"icon-Locked.png"] forState:UIControlStateNormal]; 
     // other statements 
    } 
} 

Puede utilizar otros controles similares para otros estados tales como seleccionado, habilitado, resaltó.

+0

respuesta perfecta ....... gracias :) –

3

Si desea cambiar la imagen cuando se hace clic en el botón, de esta manera, funciona a la perfección:

-(IBAction)buttonClicked: (id)sender 
{ 
    UIButton *buttonObj = (UIButton*)sender; 
    [buttonObj setBackgroundImage:[UIImage imageNamed:@"myImage.png"] 
    forState:UIControlStateNormal]; 
} 
0

odio a añadir a la gran cantidad de respuestas, pero:

  1. seleccionar imágenes en IB para los estados predeterminados y seleccionados del botón.
  2. Conecte un IBAction y manténgalo simple.

    @IBAction func buttonTapped(sender: UIButton){sender.selected = !sender.selected}

Done.

Cuestiones relacionadas