UIScrollView - (rebotes = NO) parece anular (pagingEnabled = YES)
-
22-07-2019 - |
Pregunta
Tengo un UIScrollView con paginación (así que el modelo típico con UIPageControl y arrastrando / moviendo hacia la izquierda y hacia la derecha entre las páginas), y lo tengo funcionando bien. Lo extraño es que cuando quería deshacerme del rebote (para que no pueda ver negro detrás de la interfaz de usuario en los lados izquierdo y derecho), la paginación repentina ya no funciona.
En otras palabras, cuando:
scrollView.pagingEnabled = YES;
scrollView.bounces = YES;
Todo funciona bien, excepto que no me gusta el rebote en la página (0) y la página (longitud-1). Pero cuando hago esto:
scrollView.pagingEnabled = YES;
scrollView.bounces = NO;
Deja de encajar en su lugar en cada página, en lugar de tratar todas las páginas juntas como una página larga. Por lo tanto, parece que, por alguna razón, la paginación depende del rebote, lo cual está bien siempre que pueda detenerlo de alguna manera. Entonces, ¿hay otra forma de deshacerse de él? ¿O hay algo que estoy haciendo mal?
EDITAR: La solución:
@interface PagingScrollView : UIScrollView
@end
@implementation PagingScrollView
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
self.pagingEnabled = YES;
self.bounces = YES;
}
return self;
}
- (void)setContentOffset:(CGPoint)offset
{
CGRect frame = [self frame];
CGSize contentSize = [self contentSize];
CGPoint contentOffset = [self contentOffset];
// Clamp the offset.
if (offset.x <= 0)
offset.x = 0;
else if (offset.x > contentSize.width - frame.size.width)
offset.x = contentSize.width - frame.size.width;
if (offset.y <= 0)
offset.y = 0;
else if (offset.y > contentSize.height - frame.size.height)
offset.y = contentSize.height - frame.size.height;
// Update only if necessary
if (offset.x != contentOffset.x || offset.y != contentOffset.y)
{
[super setContentOffset:offset];
}
}
@end
Solución
Su mejor opción sería escribir una subclase UIScrollView
e implementar el comportamiento deseado manualmente. Debería poder comenzar con pagingEnabled
y rebotes
ambos configurados en YES
y luego sobrescribir -setContentOffset:
con su método propio que recorta los bordes.