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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top