ios uiview uiscrollview touches

ios - toca métodos que no se llaman en UIView colocado dentro de UIScrollView



touches (3)

Cada vez que agrega una vista de desplazamiento en la jerarquía de su vista, se traga todos los detalles. Por lo tanto, no está recibiendo los toques comenzados. Entonces, para obtener los toques en la vista de inicio de sesión, deberá pasar los toques para iniciar sesión. Así es como lo haces.

Tengo una vista de desplazamiento personalizada, subclasificando UIScrollView . He agregado una vista de desplazamiento en mi archivo viewcontroller nib y he cambiado su clase a CustomScrollView. Ahora, esta vista de desplazamiento personalizada (hecha de xib) se agrega como una subvista en self.view.

En esta vista de desplazamiento, tengo 3 campos de texto y 1 UIImageView (llamado signImageView) agregado desde xib. Al hacer clic en UIImageView (se agregó un TapGestureRecogniser ), se agrega una UIView llamada signView en la vista de desplazamiento personalizada. Quiero permitir que el usuario UIView sesión en esta vista, así que creé una clase Signature.m y .h, subclasificando UIView e implementando los métodos de toques (touchesBegan, touchesMoved y touchesEnded) e inicié el signView de la siguiente manera:

signView = [[Signature alloc]initWithFrame:signImageView.frame]; [customScrollView addSubview:signView];

Pero cuando comienzo a iniciar sesión en signView, la vista se desplaza y, por lo tanto, los métodos toques no se llaman.

He intentado agregar signView en self.view en lugar de la vista de desplazamiento personalizada, pero en ese caso la vista permanece pegada a una posición fija cuando comienzo a desplazarme. (Su marco permanece fijo en este caso)


Intente configurar canCancelContentTouches de scrollView en NO y delaysContentTouches en YES .

EDITAR:

Veo que la pregunta similar fue respondida aquí Arrastrar y arrastrar con Cocoa en iPhone (la respuesta es exactamente la misma).

Si el usuario toca y mantiene signView el signView (durante aproximadamente 0.3-0.5 segundos), los touchesBegan: la vista touchesBegan: método se touchesBegan: y todos los eventos desde ese momento van al signView hasta que se touchesEnded: .

Si el usuario signView rápidamente a través de signView , UIScrollView toma el control.

Como ya tienes UIView subclasificado con touchesBegan: método implementado, tal vez podrías indicar de algún modo al usuario que tu aplicación está preparada para que él la firme (equivalente a '' luz verde '').

También podría usar touchesEnded: para apagar esta luz verde .

Sería mejor si agrega signImageView como subView de signView (en lugar de a customScrollView ) y lo oculta cuando touchesBegan: se touchesBegan: ). signView agregar signView a customScrollview en el mismo lugar donde agrega signImageView en el código existente.

Con esto subView que efectivamente haya solo una subView en ese lugar (para una mejor eficiencia de paso de toque. Y podrías lograr ese efecto de luz verde al signImageView en touchesBegan:/touchesEnded:

Si este comportamiento de la aplicación (retraso de 0.3-0.5s) es inaceptable, entonces también necesitaría subclase UIScrollView . El método de Vignesh de anular los touchesShouldBegin: UIScrollView touchesShouldBegin: podría venir al rescate. Allí es posible que pueda detectar si el toque se acordó en signView y pasarlo a esa vista de inmediato.


Logramos esto con una subclase UIScrollView que deshabilita el reconocedor de gestos pan en una lista de vistas que usted proporciona.

class PanGestureSelectiveScrollView: UIScrollView { var disablePanOnViews: [UIView]? override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { guard let disablePanOnViews = disablePanOnViews else { return super.gestureRecognizerShouldBegin(gestureRecognizer) } let touchPoint = gestureRecognizer.location(in: self) let isTouchingAnyDisablingView = disablePanOnViews.first { $0.frame.contains(touchPoint) } != nil if gestureRecognizer === panGestureRecognizer && isTouchingAnyDisablingView { return false } return true } }