2010-10-19 13 views
7

Tengo un UIScrollView que está desplazando una UIView bastante grande.Limitación del área desplazable en UIScrollView

En determinados momentos, quiero limitar el área en la que el usuario puede desplazarse. Por ejemplo, es posible que solo desee permitirles ver el último parcial de la vista.

Puedo limitar el área sobrescribiendo scrollViewDidScroll y llamando a setContentOffset si la vista se ha desplazado demasiado. Pero de esta manera no puedo recuperarlo tan suavemente como UIScrollView puede hacer naturalmente al desplazarse más allá de los límites de UIView.

¿Existe alguna forma mejor de limitar el área desplazable en UIScrollView?

Respuesta

17

Cambiaría la propiedad contentSize de la vista de desplazamiento al tamaño del área en la que desea que el usuario pueda desplazarse y ajuste el marco.origin de la subvista tal como el límite superior izquierdo que desea aparece en (0, 0) relativo a la vista de desplazamiento. Por ejemplo, si su vista tiene 800 puntos de altura y desea mostrar el cuarto inferior, establezca el alto de contentSize en 200 y configure el componente y de view.frame.origin en -600.

+3

Su respuesta fue sólo la punta derecha que tenía que resolver un problema similar que tenía. Básicamente, la diferencia entre uiscrollview.frame.size y uiscrollview.contentsize se convierte en su parte desplazable permitida. Puede jugar con la vista que se coloca en la vista de desplazamiento de cualquier forma que desee para obtener el efecto deseado que desee utilizando uiview.frame y uiview.size. Una vez que entiendes esto, la vida es buena. ¡Feliz desplazamiento! :) – HM1

+0

Aquí hay un ejemplo de solución que encapsula lógica similar: https://github.com/ealeksandrov/EARestrictedScrollView –

2

He encontrado algo que me funciona. Se le permite desplazarse al punto 0,0, pero no más lejos:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (scrollView.contentOffset.x <= -1) { 
     [scrollView setScrollEnabled:NO]; 
     [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; 
     [scrollView setScrollEnabled:YES]; 
    } 
} 

que podría hacer lo mismo para la parte superior, inferior o derecha (X o Y)

+2

El problema con este método es que se pierde el 'rebote' - donde se desplaza más allá de la región y el desplazamiento suavemente retrocede cuando lo dejas ir. –

+0

Mierda, tiene razón, no leyó correctamente. Aún así, tal vez esto puede ayudar a alguien más. – Yoko

0

Otro enfoque consiste en reemplazar el método del UIScrollView 's :

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event.

Devolución YES permitirá al usuario desplazarse. La devolución de NO no lo hará.

NOTA: Esto desactivará todos los toques a cualquier punto de vista incrustada dentro de las UIScrollView que pointInside vuelve a NO. Útil si el área desde la que no desea desplazarse no tiene ninguna interacción.


Este ejemplo sólo permite que el UIScrollView para desplazarse cuando el usuario se desplaza sobre un UITableView. (A UITableView y dos UIViews están incrustados dentro de la UIScrollView)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    for (UIView *subview in self.subviews) { 
     if ([subview pointInside:[self convertPoint:point toView:subview] withEvent:event] && ![subview isKindOfClass:[UITableView class]]) { 
      return NO; 
     } 
    } 
    return YES; 
} 
Cuestiones relacionadas