2011-08-29 10 views
14

Tengo un requisito típico en el que necesito mantener un botón en estado resaltado después de presionarlo. Necesito realizar una tarea que debería funcionar solo cuando un botón está en estado resaltado. En realidad estoy configurando un estado de botón para resaltar programáticamente.Cómo configurar el estado de UIButton que se resaltará después de presionarlo

[sender setHighlighted:YES];

Y una vez que el botón se encuentra en estado resaltado que necesito para realizar otra acción.

- (IBAction)changeState: (UIButton*)sender 
{ 
    if (sender.highlighted == YES) 
    { 
     [self performSomeAtion:sender]; 
    } 
} 

Pero, para mi horror, cada vez que se presiona cualquier botón, la condición anterior se está convirtiendo en realidad y la acción se está realizando en varias ocasiones. ¿Hay alguna forma en la que pueda mantener el estado de un UIButton resaltado después de presionarlo?

EDIT - En realidad, necesito realizar 3 acciones diferentes para 3 estados diferentes del botón. Ya estoy haciendo uso del estado seleccionado y el estado normal. Ahora, necesito hacer uso del estado resaltado.

+0

Puede establecer una variable BOOL que actualizará a TRUE una vez que se ha realizado la acción. –

+0

pero necesito establecer el botón en estado resaltado y debe permanecer en el estado resaltado a menos que lo cambie de nuevo. –

+0

Para ios 7 solo, debe considerar establecer la imagen renderMode en UIImageRenderingModeAlwaysTemplate y luego usar el color Tint para representar varios estados . ver http://stackoverflow.com/questions/19802982/apply-tintcolor-to-uiimage –

Respuesta

4

El estado resaltado se usa para resaltar el botón mientras se toca el. Un evento de toque hacia abajo en el botón lo resalta. Debería usar el estado "seleccionado" en su lugar.

Si lo que quiere hacer es realizar una acción después de presionar el botón, no conecte su método al evento de cambio de estado, adjunte su método al evento TouchUpInside.

+0

+1 para una buena explicación. En realidad, necesito realizar 3 acciones diferentes para 3 estados diferentes del botón. Aquí es donde me quedé atrapado. Cualquier ayuda sería muy apreciada (verifique mi pregunta actualizada) –

1

Use [sender setSelected: YES];, creo que le será útil.

+0

como mencioné en mi pregunta, necesito usar el estado resaltado del botón, no el estado seleccionado. –

+0

UIButton * btn_tmp = remitente; if (! (Btn_temp.selected)) {// es verdadero cuando el botón no está seleccionado alguna vez } – Narayana

15
[sender setSelected:YES]; 

o puede simular este efecto con la imagen de dos para su UIButton (notselectedimage.png y selectedimage.png), a continuación, realizar un seguimiento del estado del botón con una variable BOOL como BOOL buttonCurrentStatus;. A continuación, en el archivo .h:

BOOL buttonCurrentStatus; 

y en el archivo .m

// connect this method with Touchupinside function 
- (IBAction)changeState:(UIButton*)sender 
{ 
    /* if we have multiple buttons, then we can 
     differentiate them by tag value of button.*/ 
    // But note that you have to set the tag value before use this method. 

    if([sender tag] == yourButtontag){ 

    if (buttonCurrentStatus == NO) 
    { 
     buttonCurrentStatus = YES; 
     [butt setImage: [UIImage imageNamed:@"selectedImage.png"] forState:UIControlStateNormal]; 
     //[self performSomeAction:sender]; 
    } 
    else 
    { 
     buttonCurrentStatus = NO; 
     [butt setImage:[UIImage imageNamed:@"notSelectedImage.png"] forState:UIControlStateNormal]; 
     //[self performSomeAction:sender]; 
    } 
    } 
} 
+0

Gracias por la respuesta vijay .. Su respuesta funciona bien si tengo un solo botón. Pero mi caso es un poco más complicado. Tengo varios botones que deben realizar 3 acciones para 3 estados ... ¿Alguna sugerencia? +1 para su respuesta también ... –

+0

UISegmentControl u know.use that.if desea más ayuda, responda.http: //www.mobisoftinfotech.com/blog/iphone/iphone-segmented-controluisegmentedcontrol-tutorial/ –

+2

Si usted tener múltiples botones, todo lo que tienes que hacer es tomar la respuesta de Vijay y modificarla agregando 'tag's a tus botones y luego ... ' UIButton * botón = (UIButton *) remitente; ' ' if (button. tag == 1) ... ' –

2

La forma en que describes, que estaría mejor como subclase UIView para crear su propio botón de tres estados.

En realidad, incluso debe implementar su propio buttonView de varios estados, y administrar el estado que está internamente a través de una matriz de PNG para el aspecto y una serie de estados para saber cuántas veces se ha presionado.

0
UIButton *btn_tmp=sender; 
    if(!(btn_tmp.selected)) 
    { 
[btn_temp setHighlighted:YES]; 

} 
+0

he establecido el botón en estado resaltado. Pero, cuando trato de verificar el estado del botón, no puedo obtener el estado exacto. Supongo que cuando presiono el mismo botón, el estado se cambia de resaltado a otra cosa. ¿Hay alguna forma de encontrar ese narayana? ?. –

3

acabo de encontrar una manera, por lo que lo comparto, por si acaso ...

Mantuve UIButton y establecer una imagen para cada estado (por lo que podría ir hasta un botón de 4 estados) Configuré UserInteractionEnabled en NO -> Este botón no recibirá ningún toque. El propósito de este primer botón es mostrar un estado

Creo un segundo UIButton personalizado con el mismo marco que el primero. Para esta, ninguna imagen se establecerá para el estado (es un botón totalmente transparente). El objetivo de este botón es atrapar el evento táctil. Así que agregué un objetivo a este botón en el evento TouchUpInside. Y luego, cuando se dispara el evento, cambio el estado del primer botón a Deshabilitado, Resaltado, Seleccionado o ninguno de estos estados (= Estado predeterminado).

¡Todo funciona como un amuleto!

6
- (void)mybutton:(id)sender 
{ 
    UIButton *button = (UIButton *)sender; 
    button.selected = ![button isSelected]; // Important line 
    if (button.selected) 
    { 
     NSLog(@"Selected"); 
     NSLog(@"%i",button.tag); 
    } 
    else 
    { 
     NSLog(@"Un Selected"); 
     NSLog(@"%i",button.tag); 

    } 
} 
0

La solución es difícil, pero es posible.

El problema es que usted trató de cambiar el estado resaltado en el método de acción del botón, que supongo que hace un proceso de limpieza o verificación al final de la acción y cambia el estado resaltado. Cuando intenta depurarlo obtiene el destacado = 1 pero cambiará al final.

Extraño, pero su "botón de 3 estados" a veces es útil, cuando desea mantener un botón en el modo "resaltado" como el modo "seleccionado" para obtener una acción diferente dependiendo de los 3 estados. El único problema es que no se puede analizar esto o cambiar al modo resaltado en el método de acción del botón, ya que esto cambiará al modo resaltado inmediatamente cuando el usuario lo presione Y lo conmutará al final.

La solución está utilizando un despacho.

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [theButton setHighlighted:YES]; 
}); 

esto va a hacer el truco y se podía utilizar los 3 estados.

0

Según Apple, UIButton tiene una propiedad de imageView:

Aunque esta propiedad es de sólo lectura, sus propias propiedades son de lectura/escritura. utilizar estas propiedades para configurar la apariencia y el comportamiento de vista del botón

Esto significa que se puede establecer en el IB (en el guión gráfico) una imagen de este botón y establecer la imagen resaltada:

  1. Abra el inspector de atributos.
  2. Debajo de Botón sección, elija una imagen.
  3. En la misma sección, cambie la Configuración de estado a Destacado. Observe que la imagen que eligió por defecto ya no está y ahora puede establecer una nueva imagen para el Destacado.
  4. Ahora tiene un botón con 2 configuraciones de estado y todo lo que tiene que hacer durante el tiempo de ejecución para cambiar el button.highlighted = true. Además, verifique UIControl en Configurando los Atributos del Control para ver más estados.

También puede hacerlo mediante programación de la siguiente manera:

Swift (y casi la misma en Objective-C):

// Setting the highlighted image 
self.someButton.imageView?.highlightedImage = UIImage(named: "imageNameFromImageAssest") 
// someButton will now some the highlighted image and NOT the image set in the IB 
self.someButton.imageView?.highlighted = true 
Cuestiones relacionadas