web-dev-qa-db-fra.com

Faire défiler par programme un UIScrollView

J'ai un UIScrollView qui a plusieurs points de vue. Lorsqu'un utilisateur effleure son doigt, la vue défile vers la droite ou vers la gauche en fonction de la direction du glissement de doigt. Fondamentalement, mon code fonctionne de manière similaire à l'application photo iPhone. Maintenant, y a-t-il un moyen de faire la même chose par programme pour me retrouver avec un diaporama qui fonctionne tout seul avec un clic sur un bouton et une pause configurable entre chaque défilement?

Comment faites-vous vraiment des diaporamas avec UIScrollView?

137
climbon

Vous pouvez faire défiler l'écran en défilement jusqu'à un point quelconque avec l'une des déclarations suivantes dans Objective-C.

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

ou rapide

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

Reportez-vous au guide "Défilement du contenu de la vue de défilement" d’Apple également .

Pour faire des diaporamas avec UIScrollView, vous organisez toutes les images dans la vue de défilement, configurez une minuterie répétée, puis -setContentOffset:animated: lorsque la minuterie se déclenche.

Mais une approche plus efficace consiste à utiliser 2 vues d’image et à les échanger en utilisant des transitions ou tout simplement en changeant d’emplacement lorsque la minuterie se déclenche. Voir Diaporama Image iPhone pour plus de détails.

356
kennytm

Si vous souhaitez contrôler la durée et le style de l'animation, vous pouvez effectuer les opérations suivantes:

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

Ajustez la durée (2.0f) et les options (UIViewAnimationOptionCurveLinear) à votre goût!

37
Jon Schneider

Une autre façon est

scrollView.contentOffset = CGPointMake(x,y);
10

Avec animation à swift

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

Swift 3

   let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
    scrollView.contentOffset = point
3
Alfi
[Scrollview setContentOffset:CGPointMake(x, y) animated:YES];
2
P.J.Radadiya
scrollView.setContentOffset(CGPoint(x: y, y: x), animated: true)
2
CoderPug
- (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);
         }
     }];
}
1
Naveen

Je montre comment créer une vue de défilement simple avec deux UIView et ajouter des contraintes de mise en page automatique pour un défilement régulier.

Je suppose que vous avez un contrôleur de vue vide dans main.storyboard.

1.Ajouter un UIView.

let view = UIView()
    view.backgroundColor = UIColor.green
    self.view.addSubview(view)
    view.translatesAutoresizingMaskIntoConstraints = false
    top = view.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0)
    left = view.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0)
    right = view.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0)
    bottom = view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0)
    height = view.heightAnchor.constraint(equalToConstant: self.view.frame.height)
    NSLayoutConstraint.activate([top, right, left, height, bottom])

2.Ajouter un ScrollView.

let scroll = UIScrollView()
    scroll.backgroundColor = UIColor.red
    view.addSubview(scroll)
    scroll.translatesAutoresizingMaskIntoConstraints = false
    top = scroll.topAnchor.constraint(equalTo: view.topAnchor, constant: 10)
    left = scroll.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0)
    right = scroll.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0)
    bottom = scroll.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -10)
    NSLayoutConstraint.activate([top, right, left, bottom])

3.Ajouter d'abord UILabel.

 let l2 = UILabel()
        l2.text = "Label1"
        l2.textColor = UIColor.black
        l2.backgroundColor = UIColor.blue
        scroll.addSubview(l2)
        l2.translatesAutoresizingMaskIntoConstraints = false
        top = l2.topAnchor.constraint(equalTo: scroll.topAnchor, constant: 10)
        left = l2.leadingAnchor.constraint(equalTo: scroll.leadingAnchor, constant: 10)
        height = l2.heightAnchor.constraint(equalToConstant: 100)
        right = l2.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -10)
        NSLayoutConstraint.activate([top, left, right, height])

4.Ajouter la seconde UILabel.

let l1 = UILabel()
    l1.text = "Label2"
    l1.textColor = UIColor.black
    l1.backgroundColor = UIColor.blue
    scroll.addSubview(l1)
    l1.translatesAutoresizingMaskIntoConstraints = false
    top = l1.topAnchor.constraint(equalTo: scroll.topAnchor, constant: 1000)
    left = l1.leadingAnchor.constraint(equalTo: scroll.leadingAnchor, constant: 10)
    bottom = l1.bottomAnchor.constraint(equalTo: scroll.bottomAnchor, constant: -10)
    height = l1.heightAnchor.constraint(equalToConstant: 100)
    right = l1.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -10)
    NSLayoutConstraint.activate([left, bottom, right, height, top])

 Label1  enter image description here

0
Shiv Prakash

Je suis étonné que ce sujet ait 9 ans et que la réponse directe ne soit pas ici!

Ce que vous cherchez, c'est scrollRectToVisible(_:animated:).

Exemple:

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

Ce qu’il fait est exactement ce dont vous avez besoin, et c’est bien mieux que hacky contentOffset

Cette méthode fait défiler la vue du contenu afin que la zone définie par rect soit simplement visible dans la vue de défilement. Si la zone est déjà visible, la méthode ne fait rien.

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

0
vol