Rolar programaticamente um UIScrollView


159

Eu tenho um UIScrollViewque tem várias opiniões. Quando um usuário move o dedo, a visualização rola para a direita ou esquerda, dependendo da direção do movimento do dedo. Basicamente, meu código funciona de maneira semelhante ao aplicativo de fotos do iPhone. Agora, existe uma maneira de eu fazer programaticamente a mesma coisa, para que eu termine com uma apresentação de slides executada por si só com um clique de um botão e uma pausa configurável entre cada rolagem?

Como você realmente faz apresentações de slides UIScrollView?

Respostas:


391

Você pode rolar para algum ponto em uma exibição de rolagem com uma das seguintes instruções em Objective-C

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

ou rápido

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

Consulte o guia " Rolando o conteúdo da tela de rolagem " da Apple também .

Para fazer apresentações de slides UIScrollView, organize todas as imagens na exibição de rolagem, configure um temporizador repetido e, em seguida,-setContentOffset:animated: quando o timer dispara.

Mas uma abordagem mais eficiente é usar duas visualizações de imagem e trocá-las usando transições ou simplesmente trocando de lugar quando o timer disparar. Consulte Apresentação de slides de imagens do iPhone para obter detalhes.


1
Legal. Sim, achei que setContentOffset funciona, mas realmente queria que isso acontecesse de maneira animada. 'animado: SIM' fez o truque.
climbon

3
Apenas complementando a resposta, para mover horizontalmente para a próxima "página" no UIScrollView (supondo que você esteja codificando para iPhone), para o uso do parâmetro x (myScrollView.contentOffset.x +320).
Giovanni

2
@niraj graças cara ... em (myScrollView.contentOffset.x +320)mentiras a chave!
D_D 28/02

5
Corrija-me se estiver errado, mas o UIScrollView contentOffset:também compensará o contentSize, o que pode não ser desejável. Para rolar apenas, você pode querer usar scrollRectToVisible:.
31413 Chris

Não use as funções auxiliares C, como CGPointMakeno Swift. Simplesmente crie uma estrutura do Swift diretamente:CGPoint(x: 0, y: 44)
Arnold

42

Se você deseja controlar a duração e o estilo da animação, pode:

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

Ajuste a duração ( 2.0f) e as opções ( UIViewAnimationOptionCurveLinear) a gosto!


11

Outra maneira é

scrollView.contentOffset = CGPointMake(x,y);

14
É exatamente o mesmo que a resposta aceita. E CGPointdeveria ser CGPointMake.
Evan Mulawski

Eu gosto de respostas simples como esta.
quemeful

Na verdade, isso não é o mesmo que a resposta aceita. A resposta aceita possui uma opção de animação, que alguns aplicativos podem querer definir como SIM.
Rickster 29/09/2015

11

Com animação em Swift

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

6

Estou surpreso que este tópico tenha 9 anos e a resposta direta não está aqui!

O que você está procurando é scrollRectToVisible(_:animated:).

Exemplo:

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

O que ele faz é exatamente o que você precisa e é muito melhor que o hacky contentOffset

Esse método rola a exibição de conteúdo para que a área definida por rect fique visível apenas dentro da exibição de rolagem. Se a área já estiver visível, o método não fará nada.

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


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

3

Swift 3

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

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

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
Por favor, considere adicionar algum texto para a sua resposta, não só código puro
user1781290
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.