2010-02-13 8 views
29

¿Cuál es la forma más sencilla de tener una vista de desplazamiento (con pagingEnabled establecido en YES) tener un ancho de página establecido en algo distinto de los límites de la vista de desplazamiento?UIScrollView: con la paginación habilitada, ¿puedo "cambiar" el ancho de página?

Déjeme dar un ejemplo. Supongamos que tengo una vista de desplazamiento con 10 elementos, cada uno de 150 píxeles de ancho, y mi vista de desplazamiento tiene 300 píxeles de ancho. Si comienzo con las vistas 1 y 2 visibles y me muevo horizontalmente hacia la derecha, quiero que la siguiente "página" muestre los ítems 2 y 3. Si me desplazo una página más a la derecha, vería los ítems 3 y 4.

¿Alguien ha hecho esto? Si no, ¿qué estrategia usarías?

Respuesta

42

Alexander Repty acaba de publicar un blog sobre este mismo tema: http://blog.proculo.de/archives/180-Paging-enabled-UIScrollView-With-Previews.html. Respuesta corta: no es tan simple como simplemente cambiar el ancho de la 'página', pero no es demasiado difícil.

+0

que he visto este enfoque mencionado en otro lugar y lo intentó, pero por desgracia no creo hace lo que yo quiero Necesito algo más que ver los bordes de los elementos que los rodean. En mi caso, necesito tener dos elementos completamente en la pantalla. Desafortunadamente, este enfoque no funcionó demasiado bien para mí, especialmente en los bordes más a la izquierda/a la derecha. –

+7

Simplemente haga que su scrollview sea de 150 píxeles de ancho, pero desactive el recorte. Coloque todo dentro de una vista de 300 px de ancho y active el recorte para ello. –

+0

Gracias, Ben. Como mencioné en mi comentario sobre la respuesta de Alexander, esto definitivamente me puso en el camino correcto. –

5

Mike,

uso del enfoque de mi blog que Ben vinculado que lo haga. Haga que UIScrollView tenga la mitad del tamaño de la vista circundante (es decir, 150 px) y muévalo hacia la izquierda en lugar de dejarlo centrado.

Eso debería darle exactamente el comportamiento que quería.

Saludos, Alex

+0

No fue tan simple, pero creo que lo tengo resuelto. Tu publicación ciertamente ayudó, ¡gracias! –

4

Seguramente se puede hacer con la ayuda de métodos de delegado ScrollView & contenido-offset.

A continuación se muestra el código detallado para el mismo.

int start; 

int end; 

int k=0; 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView1 
{ 

    pageControlUsed = NO; 

    start = scrollView.contentOffset.x; 

} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView1 willDecelerate:(BOOL)decelerate 
{ 

    end = scrollView.contentOffset.x; 

} 


- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView1{ 

    int diff = end-start; 

     if (diff>0) 
     { 

     k=k+150; 
     [scrollView setContentOffset:CGPointMake(k, 0) animated:YES]; 

     } 
     else { 

     k=k-150; 
     [scrollView setContentOffset:CGPointMake(k, 0) animated:YES]; 

      } 
} 
2

simplemente anulan scrollViewWillEndDragging

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { 
    CGFloat pageWidth = 160; 
    targetContentOffset->x = pageWidth * (int)(targetContentOffset->x/pageWidth); 
} 
+1

no funciona en ios7. – kritzikratzi

1
UIScrollView *album = [[UIScrollView alloc] init]; 
album.translatesAutoresizingMaskIntoConstraints = NO; 
album.pagingEnabled = YES; 
album.clipsToBounds = NO; 
album.showsHorizontalScrollIndicator = NO; 
album.contentInset = UIEdgeInsetsMake(0, -50, 0, -50); 
[view addSubview:album]; 


[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[_album(220)]" options:0 metrics:metrics views:views]]; 

[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_album(300)]" options:0 metrics:metrics views:views]]; 

esto funciona bien en iOS 7.1 ~ 8.2

Cuestiones relacionadas