2009-04-25 10 views
19

Tengo una subvista UIButton dentro de un UITableViewCell.UIButton retraso en el cambio de estado

Cuando se toca este botón, el usuario debe mantener presionado el botón durante aproximadamente medio segundo para que la imagen del botón cambie a la imagen UIControlStateHighlighted.

Esto significa que si el usuario toca el botón como suele ser el caso, el estado resaltado nunca se muestra.

¿Por qué ocurre esto y cómo puedo solucionarlo?

+0

Por curiosidad, ¿está esto en el simulador o en el dispositivo? –

Respuesta

0

Editar: reescrito por completo después de una mala interpretación de la pregunta

Una forma de pensar de un UIButton es como una forma abreviada de la creación de un área de la pantalla que puede responder a diversos eventos de toque instantáneas de la respuesta lo hace definido por el sistema Target-Action de UIControl para entregar mensajes a otros objetos.

UIControlEventTouchDown suena como el que necesita para responder. Se activará tan pronto como alguien toque el botón: esto es lo que hace el botón "Información de contacto" en SMS.

UIButton * myButton = [[UIBulton buttonWithType: UIButtonTypeRoundedRect]; // Seleccionar el título, el marco, etc. [myButton addTarget: self action: @selector (myButtonWasPressed) forControlEvents: UIControlEventTouchDown]; [myMainView addSubView: myButton];

Enviarán un mensaje -(void)myButtonWasPressed al objeto desde el que se ejecuta este código (lo ideal es que vea el controlador). En myButtonWasPressed, puede agregar una nueva vista o realizar cualquier acción que desee. La aplicación de SMS presiona un controlador de vista para mostrar la información de contacto usando un controlador de navegación.

Si esto todavía no resuelve su problema, tendrá que publicar un código para obtener más información sobre lo que está pasando mal.

+0

Creo que malinterpretas. Si mira la aplicación SMS, por ejemplo, los iconos en la parte superior de una cadena de mensaje reaccionan instantáneamente a los toques. Estoy diciendo que mis botones no muestran una reacción instantánea al estado resaltado. No quiero que el usuario mantenga presionado un botón. Quiero que usen un botón normalmente pero que el estado del botón cambie y se refleje en el aspecto visual del botón, como se esperaba. –

+0

Está bien todavía hay un malentendido :). No hay nada de malo con las acciones o eventos de mi botón. Para recrear lo que estoy describiendo, solo cree una UITableViewCell nueva, y agregue un UIButton como una subvista de ella: es decir, [cell.contentView addSubview: button]. Luego, pruébelo en el dispositivo. Cuando toca el botón, la acción se disparará correctamente, sin embargo, el estado resaltado del botón no se produce de inmediato. Por el contrario, debe mantener presionado el botón durante medio segundo antes de ver el botón * visualmente * cambiar de estado. Todo lo que estoy hablando es la apariencia visual del botón. –

10

El problema es que su UIButton se encuentra dentro de una UITableView. Esto significa que la vista de tabla debe determinar si su toque será un deslizamiento o si solo se trata de un toque para el botón. La vista de tabla debe retrasar el envío de un mensaje al UIButton hasta que sepa que el usuario no tiene la intención de deslizar y, por lo tanto, desplazarse por la vista en lugar de presionar el botón.

Si no necesita una vista de tabla, deshágase de UITableView.

+0

Estoy viendo esto también y mi único problema con este comentario es que usar otro control como el UISwitch no produce tal retraso. – d2burke

3

Acabo de cambiar la imagen desde dentro del método de acción de destino:

[sender setBackgroundImage:[UIImage imageNamed:@"highlighted-image.png"] forState:UIControlStateNormal]; 

Cambia la imagen de fondo al instante.

+0

¡funciona, gracias! –

25

Acabo de encontrar este problema y vi que este problema no se había cerrado. Después de joder por un tiempo encontré una solución para eso.

Ahora puede solucionarlo desactivando delaysContentTouch o desmarcando la casilla "Delays toques de contenido" en la vista de tabla.

El único efecto secundario negativo es que el usuario no podrá presionar un botón e iniciar un gesto de desplazamiento. Sin embargo, si el usuario intenta desplazarse desde cualquier lugar que no acepte toques, el comportamiento debería ser el mismo que antes.

+0

Pasé probablemente 8 horas tratando de encontrar la solución para esto. Muchas gracias. – maxhud

+0

Tuve el mismo problema con un UIButton en una vista de desplazamiento. Esto lo solucionó. –

+0

Esto funciona para mí, gracias. –

10

Hasta la respuesta de David Hodge.

Solo quiero agregar una forma de eliminar ese "único efecto secundario negativo", ya descrito por David: si comienzas a desplazarte dentro de un UIcontrol en un UIScrollView con delayContentTouches = NO, el desplazamiento no funciona.

SOLUCIÓN Subclase UIScrollView (o UITableView como la pregunta original) y anular:

-(BOOL) touchesShouldCancelInContentView:(UIView *)view { 
return YES; 
} 

Sus UIControls dentro UIScrollView/UITableView cambiarán su estado inmediatamente de barril y los scrollviews será capaz de desplazarse incluso si el toque comienza en algún UIControl. Funciona de maravilla.

+0

Nunca se llama. –

Cuestiones relacionadas