programming objective learn framework development desarrollador app objective-c ios cocoa-touch uiscrollview uigesturerecognizer
proyecto de muestra

objective-c - learn - objective c documentation



Gestionar el evento tap por subvista de UIScrollView mientras se desplaza (2)

También puede ir con los métodos delegados personalizados, usando @protocol . Implementa esos métodos de delegado en el controlador de vista donde se ha agregado tu UIScrollView.

como en MyContentView :

En el método touchesBegan,

[self.delegate contentViewTapped:self];

Ahora en la clase ContainerView donde se agrega la vista de desplazamiento, implemente ese método:

- (void)contentViewTapped:(MyContentView *)myContentView { NSLog (@"ContentView no: %d", myContentView.tag); // if tag has been set while adding this view to scrollview. }

Repase los ejemplos de @protocol .

Espero que esto sea lo que requieres.

Disfruta de la codificación :)

Tengo una subclase UIScrollView personalizada con algunas vistas de contenido dentro. En algunos de ellos tengo UITapGestureRecogniser. Todo funciona bien cuando la vista de desplazamiento no se desplaza. Pero cuando se desplaza por las vistas de contenido no recibe acción de toque. ¿Cuál es la solución más simple para manejar la acción de tap por subvista mientras se desplaza la vista de desplazamiento?

Detalles:

MyScrollView desplaza horizontalmente. Contiene una gran cantidad de vistas de contenido (por ejemplo, MyContentView ). Cada MyContentView tiene un ancho de alrededor de un tercio del ancho MyScrollView . Así que hay alrededor de 3-4 elementos visibles de MyContentView en un momento. El comportamiento principal de MyScrollView es 1) asegurarse de que después de desplazarse uno de los elementos de MyContentView estará en el centro de la pantalla y 2) para desplazarse al centro de MyContentView si el usuario toca en él . Así que la respuesta principal que espero obtener es cómo implementar "correctamente" el manejo de la acción de tap en MyContentView mientras MyScrollView se desacelera.

Encontré algunas mismas preguntas y respuestas, pero ninguna de ellas me satisfizo. Lo mejor fue implementar gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: del delegado UITAPGestureRecogniser. Pero en este caso, a veces (cuando toco, hago un pequeño arrastrar y suelto el dedo para que el tap sea reconocible de acero (lo llamo cuasi tap )) tiene eventos de tap y scroll y me provoca errores incluso si la vista de desplazamiento no se desplaza cuando empiezo a tocar Cuando el usuario hace cuasi tap, mi aplicación intenta desplazarse hacia el elemento MyContentView tocado y luego manejar inmediatamente el desplazamiento normal. Parece incluso más terrible, debido a otras funciones que comienzan a funcionar después de manejar el tap (no debe funcionar cuando se realiza un desplazamiento normal).

Necesito una solución en la que la vista de desplazamiento espere lo suficiente como para decidir que no se trata de un evento tap y solo entonces hacer un scroll. De lo contrario, si el evento tap hubiera reconocido el desplazamiento, no debe suceder.


Esto está integrado en UIScrollView : echa un vistazo a las propiedades delaysContentTouches y canCancelContentTouches . Esto debería aliviar el problema al arrastrar un bit pequeño después de un toque.

Este es todo el comportamiento incorporado en el sistema. Sugiero seguir con lo que Apple ha proporcionado para la sensación de su interfaz (por ejemplo, cómo reacciona a pequeñas pérdidas) para que su aplicación no se sienta fuera de lugar en el teléfono de un usuario.

EDITAR:

Alternativamente, puede deshabilitar el desplazamiento de su vista de desplazamiento en su reconocedor de gestos y volver a habilitarlo una vez que finaliza / cancela.

Edición adicional: No entiendo: he creado un proyecto de muestra que ilustra cómo interceptar toques en una subvista de una vista de desplazamiento usando métodos de delegado reconocedor de gestos. Preste mucha atención a las propiedades de "Toques de contenido cancelable" y "Retrasa toques de contenido" de la vista de desplazamiento. Ambos son YES por razones muy importantes.

La vista de desplazamiento debería retrasar los toques de contenido hasta que haya determinado si el usuario está intentando tocar, pseudo-toque (como lo dice) o una panorámica para la vista de desplazamiento. Apple ya ha escrito la funcionalidad que intentas construir; UIScrollView ya hará lo que quieras.

El problema es que el sistema no quiere que las subvistas de una vista de desplazamiento intercepten los eventos de tap mientras se desplaza la vista de desplazamiento. Con este fin, cancela los eventos táctiles si determina que el usuario realmente está intentando desplazarse. El ajuste "Retrasar toques de contenido" habilita este comportamiento. Asegúrese de que esté encendido y de que esté bien.