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
}
}