2010-09-17 15 views
10

Mire la aplicación App Store, ya sea en el iPhone o en el iPad, específicamente la pieza en la pantalla de detalles de la aplicación que muestra capturas de pantalla. El visor de captura de pantalla muestra la captura de pantalla que está viendo y los bordes de la siguiente y de la anterior. Necesito implementar algo así.Paginación UIScrollView con páginas vecinas que miran a escondidas

Cómo lo hice es aceptable a pobre: ​​construí un UIScrollView y habilité la búsqueda y expuse mi contenido. Hice que el marco sea del mismo tamaño que una página de contenido, pero más pequeño que la pantalla. Luego deshabilité clipToBounds, por lo que todo lo que está fuera del marco de ScrollView aún se dibuja. Ahora puedo VER los bordes de las páginas adyacentes, pero están fuera de ScrollView y, por lo tanto, no pueden recibir toques de desplazamiento. La aplicación App Store te permite tocar todo el ancho de esa cosa, incluidos los bordes de las páginas vecinas.

¿Cómo hicieron eso?

Respuesta

17

Necesita agregar una vista "detrás" de la vista de desplazamiento que cubre todo el área donde estarán visibles sus páginas. Esta vista debe implementar -hitTest: withEvent :. El sistema operativo llamará a este método para determinar dónde enrutar un evento táctil en particular. Todo lo que necesita hacer es devolver la vista de desplazamiento de cualquier punto de vista dentro de este respaldo:

- (UIView *) hitTest: (CGPoint) pt withEvent: (UIEvent *) event { 
    if (CGRectContainsPoint(self.bounds, pt)) return self.scrollView; 
    return [super hitTest: pt withEvent: event]; 
} 
+0

¡No puedo creer que sea así de simple! Pasarán uno o dos días antes de que pueda probarlo (la mala planificación por parte de mi cliente, de hecho, constituye una emergencia de mi parte, resulta), pero de todos modos le daré el cheque provisionalmente. ¡Aclamaciones! –

+0

¡Muchas gracias por esta respuesta, Ben! Esto de hecho funciona genial. –

+3

Intenté la solución anterior también, pero descubro que los elementos mismos en la vista de desplazamiento ya no reciben eventos táctiles, solo lo hace la vista de desplazamiento. ¿Es este comportamiento esperado? –

0

No se olvide de enviar los toques a los subvistas ScrollView si desea que su contenido interactivo para permanecer fuera de los límites.

El siguiente ejemplo es verdadero si ha puesto su contenido de vista de desplazamiento en un contenedor adicional. Si este no es el caso, recorra las subvistas y regrese la que recibe el toque.

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

Intenté esto pero el método de la prueba de éxito de UIScrollView nunca se llama. ¿Cómo estás haciendo tu jerarquía de vistas? – htafoya

1

que no tienen un alto suficiente rango para comentar sobre las respuestas anteriores, pero se puede encontrar un código tutorial y la muestra en el sitio de Ray Wenderlich: How To Use UIScrollView to Scroll and Zoom Content

Este código hace uso de las técnicas mencionadas anteriormente, específicamente la lógica de prueba de golpe.

Cuestiones relacionadas