El UIScrollView nested no rebotará y no detectará gestos de deslizamiento lento cuando el rebote se establece en NO

Lo siento por el título largo y autoexplicativo, pero UIScrollView ha planteado tantas preguntas que me resulta difícil llegar a las que podrían ayudar en diferentes situaciones.

He nested scrollviews en mi aplicación de iPad. Hasta ahora todo está bien, todo tiene sus altibajos pero es muy elegante y receptivo. Mi vista de desplazamiento externo es una vista paginada, que contiene visiones de desplazamiento a pantalla completa o más grandes. La vista de desplazamiento externa es horizontal e interior vertical. Como la galería de fotos. Descubrí que cuando estoy haciendo zoom y desplazando la vista de desplazamiento interna, hay un retraso notable en la detección de movimientos de deslizamiento lento y largo SÓLO cuando la vista de desplazamiento se ha desplazado hacia abajo hasta el final del contenido y el rebote está en OFF.

la otra cosa es que la propiedad rebotando scrollview interior va SÍ / NO pseudo-aleatoriamente. Entonces, este es el código en el constructor que establece las scrollviews internas que están actuando:

if (UIInterfaceOrientationIsPortrait(forOrientation)) { self.minimumZoomScale = 1.0; self.maximumZoomScale = 1.0; self.bounces = NO; self.alwaysBounceVertical = NO; self.scrollEnabled = NO; }else if (UIInterfaceOrientationIsLandscape(forOrientation)){ self.minimumZoomScale = 1.333333f; self.maximumZoomScale = 1.333333f; self.bounces = YES; self.alwaysBounceVertical = YES; self.scrollEnabled = YES; } self.scrollsToTop = NO; self.showsVerticalScrollIndicator = YES; self.showsHorizontalScrollIndicator = NO; self.directionalLockEnabled = YES; self.delegate = self; self.pagingEnabled = NO; self.canCancelContentTouches = NO; self.delaysContentTouches = YES; 

Cuando el iPad se gira, el rebote irá y desaparecerá también para la vista de desplazamiento y también tendrá un error de rebote.

¿Esto es un error? ¿o solo soy yo quien lo estropeo?

¡Gracias de antemano por tu time e interés!

ACTUALIZACIÓN: Estoy anidando dos vistas de desplazamiento que en realidad son subclasss de UIScrollView. Estoy haciendo esto porque necesito anular el hitTest y otros methods también. También probé la mejor solución descrita aquí http://openradar.appspot.com/8045239 y no obtuve buenos resultados.

Estoy respondiendo mi propia pregunta.

La solución de errores de radar abierta que se publica en la publicación de preguntas no está muy limpia sobre qué aislar para evitar que uiscrollview cambie el tamaño y cancele los rebotes.

Básicamente, TODO lo que puede cambiar el marco de la vista durante layoutSubViews solo debe hacerse UNA VEZ comprobando que si el tamaño es igual al cambio codificado en layoutSubviews, entonces no se ejecutará más de una vez.

 -(void)layoutSubviews { ///... if (!self.bounces) { self.bounces = YES; } if(!self.scrollEnabled){ self.scrollEnabled = YES; } if (!CGSizeEqualToSize(rect.size, self.contentSize)) { self.contentSize = rect.size; } if (self.zoomScale < MAXIMUM_ZOOM_SCALE ) { [self zoomToRect:ZOOM_RECT_MAKE animated:NO];// otherwise this line of code won't do anything at all } } 

Al insert scrollviews siempre se generarán problemas de respuesta táctil. Estoy asumiendo que lo interno es el principal: ¿los usuarios interactúan con más? En general, probablemente tendrá que escribir algunos de sus propios respondedores táctiles (al less, esa ha sido mi experiencia, tanto en código como en torno a SO). Haga que el desplazamiento vertical sea más indulgente, pero solo detecte un range estrecho de golpes y arrastres (líneas casi horizontales) para el exterior. De esta forma, la mayoría de las inputs táctiles se enviarán a la vista interna.

En cuanto a los rebotes, elimine uno de los lugares donde estableció la propiedad y vea qué sucede.

¿En qué método está esto? Esperemos que este código esté residiendo en una subclass UIView …?