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?

climbon
fonte

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.

kennytm
fonte
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!

Jon Schneider
fonte
11

Outra maneira é

scrollView.contentOffset = CGPointMake(x,y);
Sohail Mohabbat Ali
fonte
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)
Michael
fonte
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

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

Swift 3

   let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
    scrollView.contentOffset = point
Alfi
fonte
2
[Scrollview setContentOffset:CGPointMake(x, y) animated:YES];
PJRadadiya
fonte
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
fonte
8
Por favor, considere adicionar algum texto para a sua resposta, não só código puro
user1781290