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?

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.


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!


11

Otra forma es

scrollView.contentOffset = CGPointMake(x,y);

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)

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



3

Swift 3

   let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
    scrollView.contentOffset = point


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);
         }
     }];
}

8
Considere agregar texto a su respuesta, no solo código puro
usuario1781290
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.