Desplazar programáticamente un UIScrollView

159

Tengo una UIScrollViewque tiene varias vistas. Cuando un usuario mueve su dedo, la vista se desplaza hacia la derecha o hacia la izquierda según la dirección del movimiento del dedo. Básicamente, mi código funciona de manera similar a la aplicación de fotos para iPhone. Ahora, ¿hay alguna manera de que pueda hacer lo mismo mediante programación para que termine con una presentación de diapositivas que se ejecuta sola con un clic de un botón y una pausa configurable entre cada desplazamiento?

¿Cómo se hacen realmente las presentaciones de diapositivas UIScrollView?

subirse a
fuente

Respuestas:

391

Puede desplazarse a algún punto en una vista de desplazamiento con una de las siguientes declaraciones en Objective-C

[scrollView setContentOffset:CGPointMake(x, y) animated:YES];

o rápido

scrollView.setContentOffset(CGPoint(x: x, y: y), animated: true)

Consulte la guía " Desplazamiento del contenido de la vista de desplazamiento " de Apple también .

Para hacer presentaciones de diapositivas UIScrollView, organiza todas las imágenes en la vista de desplazamiento, configura un temporizador repetido y luego -setContentOffset:animated:cuando se activa el temporizador.

Pero un enfoque más eficiente es usar 2 vistas de imágenes e intercambiarlas usando transiciones o simplemente cambiando de lugar cuando se dispara el temporizador. Ver presentación de diapositivas de imágenes de iPhone para más detalles.

kennytm
fuente
1
Frio. Sí, encontré que setContentOffset funciona, pero realmente quería que esto sucediera de forma animada. 'animado: SÍ' hizo el truco.
Climbon
3
Simplemente complementando la respuesta, para moverse horizontalmente a la siguiente "página" en UIScrollView (suponiendo que esté codificando para iPhone), para el uso del parámetro x (myScrollView.contentOffset.x +320).
Giovanni
2
@niraj gracias amigo ... en (myScrollView.contentOffset.x +320)mentiras la clave!
D_D
55
Corrígeme si me equivoco, pero UIScrollView contentOffset:también compensará el contentSize, lo que puede no ser deseable. Para desplazarse solo, es posible que desee usar scrollRectToVisible:.
Chris
No utilice las funciones de ayuda de C como CGPointMakeen Swift. Simplemente construya una estructura Swift directamente:CGPoint(x: 0, y: 44)
Arnold
42

Si desea controlar la duración y el estilo de la animación, puede hacer lo siguiente:

[UIView animateWithDuration:2.0f delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
    scrollView.contentOffset = CGPointMake(x, y);
} completion:NULL];

¡Ajuste la duración ( 2.0f) y las opciones ( UIViewAnimationOptionCurveLinear) al gusto!

Jon Schneider
fuente
11

Otra forma es

scrollView.contentOffset = CGPointMake(x,y);
Sohail Mohabbat Ali
fuente
14
Esto es exactamente lo mismo que la respuesta aceptada. Y CGPointdebería ser CGPointMake.
Evan Mulawski
Me gustan las respuestas simples como esta.
2015
En realidad, esto no es lo mismo que la respuesta aceptada. La respuesta aceptada tiene una opción de animación, que algunas aplicaciones pueden querer configurar en SÍ.
Rickster
11

Con animación en Swift

scrollView.setContentOffset(CGPointMake(x, y), animated: true)
Miguel
fuente
6

¡Estoy sorprendido de que este tema tenga 9 años y la respuesta directa real no esté aquí!

Lo que estás buscando es scrollRectToVisible(_:animated:).

Ejemplo:

extension SignUpView: UITextFieldDelegate {
    func textFieldDidBeginEditing(_ textField: UITextField) {
        scrollView.scrollRectToVisible(textField.frame, animated: true)
    }
}

Lo que hace es exactamente lo que necesitas, y es mucho mejor que hacky contentOffset

Este método desplaza la vista de contenido para que el área definida por rect sea visible dentro de la vista de desplazamiento. Si el área ya está visible, el método no hace nada.

De: https://developer.apple.com/documentation/uikit/uiscrollview/1619439-scrollrecttovisible

vol
fuente
3
scrollView.setContentOffset(CGPoint(x: y, y: x), animated: true)
CodificadorPug
fuente
3

Swift 3

   let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
    scrollView.contentOffset = point
Alfi
fuente
2
[Scrollview setContentOffset:CGPointMake(x, y) animated:YES];
PJRadadiya
fuente
0
- (void)viewDidLoad
{
    [super viewDidLoad];
    board=[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.height, 80)];
    board.backgroundColor=[UIColor greenColor];
    [self.view addSubview:board];
    // Do any additional setup after loading the view.
}


-(void)viewDidLayoutSubviews
{


    NSString *str=@"ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    index=1;
    for (int i=0; i<20; i++)
    {
        UILabel *lbl=[[UILabel alloc]initWithFrame:CGRectMake(-50, 15, 50, 50)];
        lbl.tag=i+1;
        lbl.text=[NSString stringWithFormat:@"%c",[str characterAtIndex:arc4random()%str.length]];
        lbl.textColor=[UIColor darkGrayColor];
        lbl.textAlignment=NSTextAlignmentCenter;
        lbl.font=[UIFont systemFontOfSize:40];
        lbl.layer.borderWidth=1;
        lbl.layer.borderColor=[UIColor blackColor].CGColor;
        [board addSubview:lbl];
    }

    [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(CallAnimation) userInfo:nil repeats:YES];

    NSLog(@"%d",[board subviews].count);
}


-(void)CallAnimation
{

    if (index>20) {
        index=1;
    }
    UIView *aView=[board viewWithTag:index];
    [self doAnimation:aView];
    index++;
    NSLog(@"%d",index);
}

-(void)doAnimation:(UIView*)aView
{
    [UIView animateWithDuration:10 delay:0 options:UIViewAnimationOptionCurveLinear  animations:^{
        aView.frame=CGRectMake(self.view.frame.size.height, 15, 50, 50);
    }
                     completion:^(BOOL isDone)
     {
         if (isDone) {
             //do Somthing
                        aView.frame=CGRectMake(-50, 15, 50, 50);
         }
     }];
}
Naveen
fuente
8
Considere agregar texto a su respuesta, no solo código puro
usuario1781290