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?

klettern auf
quelle

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 .

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

Jon Schneider
quelle
11

Ein anderer Weg ist

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

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

Swift 3

   let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
    scrollView.contentOffset = point
Alfi
quelle
2
[Scrollview setContentOffset:CGPointMake(x, y) animated:YES];
PJRadadiya
quelle
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
quelle
8
Bitte erwägen Sie, Ihrer Antwort Text hinzuzufügen, nicht nur reinen Code
user1781290