2012-01-16 25 views
5

Tengo una vista de desplazamiento que tiene 256x256 de ancho/alto. Tengo subvistas de esa vista de desplazamiento que se extiende en ambas direcciones (izquierda y derecha). Establezco clipToBounds en NO para que pueda ver los elementos en la vista de desplazamiento.iOS UIScrollView clipToBounds = NO No se detectaron subvistas

Cuando el usuario toca un espacio en el titular de la vista de desplazamiento (el área que se extiende más allá de 256x256), compruebo el hittest y devuelvo el scrollView.

Mi problema es que los elementos en mi scrollview son botones, y si el botón no está dentro de 256x256 no está recibiendo los eventos táctiles. ¿Cómo hago un ciclo a través de los botones en la vista de desplazamiento y luego reenvio los eventos a los botones?

que estoy haciendo como esto Paging UIScrollView with peeking neighbor pages

Pero mis subvistas ScrollView no están recibiendo eventos.

He intentado todo lo siguiente en mi opinión que se supone que envía eventos por el cable y mis botones no recibirán los eventos. La cadena de eventos siempre se detiene en mi vista UIScroll, lo que me permite desplazar mis elementos, pero ¿cómo puedo reenviar eventos 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; 
} 

Respuesta

-1

su scrollview debe ser más grande. No se detectarán todos los eventos fuera del marco de la vista de desplazamiento principal. Si necesita mostrar al usuario una zona de fondo específica, coloque el fondo de su scrollview transparente y coloque otra vista atrás.

+0

Hice la vista de desplazamiento del tamaño que es porque necesito que la búsqueda funcione correctamente. Si amplío el ancho de la vista de desplazamiento al ancho completo, se muestra el ancho completo (en lugar de un ícono). ¿Hay alguna forma de configurar la ubicación de la aplicación de forma programática? – spentak

0

¿Has sobreescrito 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]; 
} 
+0

Tengo este código exacto en mi clase personalizada de scrollview, pero los botones nunca reciben el evento. – spentak

6

Esta fue la respuesta y la mejor solución. En lugar de tener la vista arbitraria para reenviar eventos, solo hacemos esto en UIScrollView y todos los botones y toques 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; 
} 
+0

He estado tratando de hacer lo mismo, y esto funcionó perfectamente para mí. Gracias. – ultrafez

0

están en la sección Detección de Toques fuera de un desplazamiento Ver en el tutorial de Matt Galloway How To Use UIScrollView to Scroll and Zoom Content -

a tomar la vista de desplazamiento menor que la pantalla y con subvistas clip sin marcar:

Xcode screenshot

Y envuélvalo en una vista de contenedor, que reenvía eventos 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; 
} 
Cuestiones relacionadas