iOS UIScrollView clipToBounds = NO subtestings no detectadas

Tengo una vista de desplazamiento que es de 256×256 en ancho / alto. Tengo vistas subidas de esa vista de desplazamiento que se extiende en ambas direcciones (izquierda y derecha). Configuro clipToBounds a NO para que pueda ver los elementos en la vista de desplazamiento.

Cuando el usuario toca un espacio en el soporte de scrollview (el área que se extiende más allá de 256×256), reviso el post más rápido y devuelvo scrollView.

Mi problema es que los elementos en mi scrollview son botones, y si el button no está dentro de 256×256 no recibe los events táctiles. ¿Cómo hago para recorrer los botones en la vista de desplazamiento y luego reenviar los events a los botones?

Estoy haciendo esta pagination UIScrollView con páginas vecinas

Pero mis subprocesss scrollview no reciben events.

He intentado todo lo siguiente en mi opinión que se supone que debe enviar events por cable y mis botones no recibirán los events. La cadena de events siempre se detiene en mi vista UIScroll, lo que me permite desplazar mis elementos, pero ¿cómo reenvío events a los botones desde la vista de desplazamiento?

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if ([self pointInside:point withEvent:event]) { return self.scrollView; } return nil; } - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if ([self pointInside:point withEvent:event]) { return self.scrollView; } return nil; } - (UIView *) hitTest:(CGPoint) point withEvent:(UIEvent *)event { UIView* child = nil; if ((child = [super hitTest:point withEvent:event]) == self) { return self.scrollView; } return child; } 

Esta fue la respuesta y mejor solución. En lugar de tener la vista arbitraria para reenviar events, simplemente hacemos esto en UIScrollView y todos los botones y deslizamientos funcionan bien.

 - (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event { UIView *view = [super hitTest:point withEvent:event]; for (UIView *subview in self.subviews) { if (view != nil && view.userInteractionEnabled) { break; } CGPoint newPoint = [self convertPoint:point toView:subview]; view = [subview hitTest:newPoint withEvent:event]; } return view; } 

¿Has anulado el hitTest de UIScrollView?

 - (UIView*)hitTest:(CGPoint)pt withEvent:(UIEvent*)event { UIView *contentView = [self.subviews count] ? [self.subviews objectAtIndex:0] : nil; return [contentView hitTest:pt withEvent:event]; } 

Consulte la sección Detección de toques fuera de una vista de desplazamiento en el tutorial de Matt Galloway Cómo usar UIScrollView para desplazar y ampliar contenido :

Haces que la vista de desplazamiento sea más pequeña que la pantalla y con Clip Subviews sin marcar:

Xcode captura de pantalla

Y envuélvalo en una vista de contenedor, que reenvía los events a la vista de desplazamiento:

 - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event { UIView *view = [super hitTest:point withEvent:event]; if (view == self) { return _scrollView; } return view; } 

tu scrollview debería ser más grande. No se detectarán todos los events que se encuentren fuera del cuadro principal de la window de desplazamiento. Si necesita mostrar al usuario una zona de background específica, coloque el background de la vista de desplazamiento transparente y coloque otra vista detrás.