Scrollen Sie programmgesteuert durch eine UIScrollView


159

Ich habe eine, UIScrollViewdie mehrere Ansichten hat. Wenn ein Benutzer mit dem Finger schnippt, wird die Ansicht je nach Richtung der Fingerbewegung nach rechts oder links verschoben. Grundsätzlich funktioniert mein Code ähnlich wie die iPhone-Foto-App. Gibt es eine Möglichkeit, programmgesteuert dasselbe zu tun, sodass ich eine Diashow erhalte, die mit einem Klick auf eine Schaltfläche und einer konfigurierbaren Pause zwischen den einzelnen Bildläufen eigenständig ausgeführt wird?

Wie macht man Diashows wirklich UIScrollView?

Antworten:


391

Sie können mit einer der folgenden Anweisungen in Objective-C zu einem bestimmten Punkt in einer Bildlaufansicht scrollen

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

oder Swift

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

Siehe auch die Anleitung " Scrollen des Inhalts der Bildlaufansicht " von Apple .

Um Diashows zu UIScrollViewerstellen, ordnen Sie alle Bilder in der Bildlaufansicht an, richten einen wiederholten Timer ein und dann, -setContentOffset:animated:wenn der Timer ausgelöst wird.

Ein effizienterer Ansatz besteht jedoch darin, zwei Bildansichten zu verwenden und diese mithilfe von Übergängen auszutauschen oder einfach die Orte zu wechseln, wenn der Timer ausgelöst wird. Weitere Informationen finden Sie in der Diashow für iPhone-Bilder .


1
Cool. Ja, ich habe festgestellt, dass setContentOffset funktioniert, wollte aber wirklich, dass dies auf animierte Weise geschieht. 'animiert: JA' hat es geschafft.
Aufstieg

3
Ergänzen Sie einfach die Antwort, um horizontal zur nächsten "Seite" in UIScrollView zu wechseln (vorausgesetzt, Sie codieren für das iPhone), um den x-Parameter zu verwenden (myScrollView.contentOffset.x +320).
Giovanni

2
@niraj danke Kumpel ... in (myScrollView.contentOffset.x +320)Lügen liegt der Schlüssel!
D_D

5
Korrigieren Sie mich, wenn ich falsch liege, aber UIScrollView contentOffset:wird auch die contentSize ausgleichen, was möglicherweise nicht wünschenswert ist. Um nur zu scrollen, möchten Sie möglicherweise verwenden scrollRectToVisible:.
Chris

Verwenden Sie keine C-Hilfsfunktionen wie CGPointMakein Swift. Erstellen Sie einfach eine Swift-Struktur direkt:CGPoint(x: 0, y: 44)
Arnold

42

Wenn Sie die Dauer und den Stil der Animation steuern möchten, haben Sie folgende Möglichkeiten:

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

Passen Sie die Dauer ( 2.0f) und Optionen ( UIViewAnimationOptionCurveLinear) nach Geschmack an!


11

Ein anderer Weg ist

scrollView.contentOffset = CGPointMake(x,y);

14
Dies entspricht genau der akzeptierten Antwort. Und CGPointsollte es sein CGPointMake.
Evan Mulawski

Ich mag einfache Antworten wie diese.
quemeful

Tatsächlich ist dies nicht dasselbe wie die akzeptierte Antwort. Die akzeptierte Antwort verfügt über eine animierte Option, die einige Apps möglicherweise auf JA gesetzt haben möchten.
Rickster

11

Mit Animation in Swift

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

6

Ich bin erstaunt, dass dieses Thema 9 Jahre alt ist und die eigentliche direkte Antwort nicht hier ist!

Was Sie suchen, ist scrollRectToVisible(_:animated:).

Beispiel:

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

Was es tut, ist genau das, was Sie brauchen, und es ist weitaus besser als hacky contentOffset

Diese Methode scrollt die Inhaltsansicht so, dass der durch rect definierte Bereich nur in der Bildlaufansicht sichtbar ist. Wenn der Bereich bereits sichtbar ist, führt die Methode nichts aus.

Von: 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


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
Bitte erwägen Sie, Ihrer Antwort Text hinzuzufügen, nicht nur reinen Code
user1781290
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.