¿Cómo configurar una subclass de UIScrollView para responder a los events táctiles?

Recientemente tuve un problema con respecto a no poder registrar events touch ( touchesMoved , etc.) desde un UIScrollView . Después de hablar con muchas personas y leer toneladas de publicaciones, resulta que UIScrollView acepta tactos en sí, y en cambio los toques deben pasar a una subclass UIScrollView .

Soy muy nuevo en el objective-c, y estoy pasando un mal momento al leer cómo se definen las subclasss (en files .h / .m separados o de alguna manera en @interface o algo así), así como cómo trata iOS con las cadenas de respuesta .

Permítanme describir mi situación exacta, y cualquier persona dispuesta a explicar lo que necesito hacer en noob-speak será muy apreciada.

Tengo una página en mi aplicación y he cambiado su UIView pnetworkingeterminado a UIScrollView , así que si lo inspecciono en InterfaceBuidler todo lo que veo es mi SampleViewController y UIScrollView . @Interface mi UIScrollView a la @Interface de SampleViewControler.h así:

 #import <UIKit/UIKit.h> @interface SampleViewController : UIViewController { } @property (strong, nonatomic) IBOutlet UIScrollView *mainScroller; @end 

Y hice reference a mi UIScrollView en SampleViewController.m así:

 #import "SampleViewController.h" @interface SampleViewController () @end @implementation SampleViewController @synthesize mainScroller = _mainScroller; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"Movement!"); } -(void)viewWillAppear:(BOOL)animated { [_mainScroller setContentOffset:CGPointMake(0,0) animated:YES]; } 

Si cambio la class de UIScrollView a UIView , los toques se detectan y disparo algunos posts NSLog . Sin embargo, una vez que UIView se configura nuevamente en UIScrollView , los toques son ignorados.

De lo que entiendo necesito configurar una subclass de UIScrollView con el código:

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"Movement!"); } 

… y luego cambiar mi SampleViewController.m para tener el código:

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [[self.nextResponder nextResponder] touchesMoved:touches withEvent:event]; } 

Sin embargo, realmente no entiendo 1) cómo configurar una subclass de este tipo, y 2) por qué esto funcionaría, ya que no veo por qué [[self.nextResponder nextResponder] touchesMoved:touches withEvent:event]; alguna vez se llamará en primer lugar desde SampleViewController.m , ya que mi NSLog(@"Movement!"); similar NSLog(@"Movement!"); la statement nunca se ejecuta.

¡He intentado cada tutorial que pude encontrar y estoy recurriendo a la experiencia de SE! Gracias.

Estás pensando en este error. Si desea saber cuándo se está moviendo un scrollView, no hay necesidad de subclass. iOS ha configurado todos los methods que necesita dentro del UIScrollViewDelegate . SI, sin embargo, quiere decir, tome touchEvents para artículos basados ​​en scrollView, entonces está perfectamente bien. Deberá simplemente subclamar los elementos dentro del scrollView y recoger los touchEvents dentro de las classs respectivas sin embargo. Pero solo para los methods estándar de scrollView debería configurarlo de la siguiente manera:

.MARIDO

  #import <UIKit/UIKit.h> @interface SampleViewController : UIViewController<UIScrollViewDelegate> { } @property (strong, nonatomic) IBOutlet UIScrollView *mainScroller; @end 

.METRO

 #import "SampleViewController.h" @interface SampleViewController () @end @implementation SampleViewController @synthesize mainScroller = _mainScroller; -(void)viewDidLoad { self.mainScroller.delegate=self;//Adopt the delegate for the scrollView..this is the important line } 

Luego simplemente implementa el UIScrollViewDelegateMethods para capturar el movimiento, etc. Se producirá un comportamiento indefinido al tratar de tocar touchEvents dentro de un scrollView / tableView, ya que el scrollView ya implementa esos touchEvents detrás de escena

Mira todos los methods en el sitio para desarrolladores e implementalos en tu file .M. Dado que ha adoptado el delegado en viewDidLoad, estos serán sus respaldos de scrollView. He enumerado algunos de ellos antes, pero sigue adelante y mira el sitio del protocolo UIScrollViewDelegate

 – scrollViewDidScroll: – scrollViewWillBeginDragging: – scrollViewWillEndDragging:withVelocity:targetContentOffset: – scrollViewDidEndDragging:willDecelerate: – scrollViewShouldScrollToTop: – scrollViewDidScrollToTop: – scrollViewWillBeginDecelerating: – scrollViewDidEndDecelerating: 

Publicé una respuesta a una pregunta similar hace unos días que podría ayudarlo también. Mira esta pregunta y mi respuesta .

Parece que estás cerca de hacer que funcione, pero te has confundido un poco acerca de dónde colocar los methods touchesMoved .

En su subclass de UIScrollView , debería tener:

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [[self.nextResponder nextResponder] touchesMoved:touches withEvent:event]; } 

Y en su file SampleViewController.m :

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"Movement!"); } 

(Tienes estos dos al revés en tu pregunta).