2009-09-18 9 views
8

Tengo un UIScrollView con paginación en él (por lo que el modelo típico con un UIPageControl y arrastrando/moviendo hacia la izquierda y derecha entre las páginas), y tengo que funciona bien Lo extraño es que cuando quise deshacerme de los rebotes (para que no se vea negro detrás de la IU en los lados izquierdo y derecho), las paginación de repente ya no funcionan.UIScrollView - (rebotes = NO) parece anular (pagingEnabled = YES)

En otras palabras, cuando:

scrollView.pagingEnabled = YES; 
scrollView.bounces = YES; 

Todo funciona bien, excepto que no me gustan los rebotes en la página (0) y la página (longitud-1). Pero cuando hago esto:

scrollView.pagingEnabled = YES; 
scrollView.bounces = NO; 

Se detiene romperse en su lugar en cada página, en lugar tratar todas las páginas juntos como una página de largo. Así que parece que, por alguna razón, la paginación depende de los rebotes, lo cual está bien siempre que de alguna manera pueda detener el rebote. Entonces, ¿hay otra forma de deshacerse de él? ¿O hay algo que estoy haciendo mal?

EDIT: 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 

Respuesta

9

Su mejor opción sería escribir una subclase UIScrollView e implementar el comportamiento deseado de forma manual. Debería poder comenzar con pagingEnabled y bounces ambos configurados en YES y luego sobrescribir -setContentOffset: con su propio método que recorta los bordes.

+0

Guau, eso es estúpido. Bueno, lo intentaré, puedes ser el "gran ganador" en este tema. – Eli

+0

Funciona, pero necesita anular -setContentOffset, not -setContentOffset: animated, ya que este último llamará a una función que no siempre se llama, mientras que el primero anula la función del mutador para contentOffset para que pueda detectar todos los casos. – Eli

+0

Eso es extraño. Hago mucho de este tipo de cosas y generalmente el método de parámetro único llama a la variante animada con animada: SÍ – rpetrich

Cuestiones relacionadas