Programowe przewijanie UIScrollView

159

Mam, UIScrollViewktóry ma kilka widoków. Gdy użytkownik pstryknie palcem, widok jest przewijany w prawo lub w lewo w zależności od kierunku ruchu palcem. Zasadniczo mój kod działa w sposób podobny do aplikacji do zdjęć na iPhonie. Teraz, czy istnieje sposób, w jaki mogę programowo zrobić to samo, aby skończyć z pokazem slajdów, który działa samodzielnie po kliknięciu przycisku i konfigurowalnej pauzie między każdym przewijaniem?

Jak naprawdę robisz pokazy slajdów UIScrollView?

wspinać się na
źródło

Odpowiedzi:

391

Możesz przewinąć do dowolnego punktu w widoku przewijania za pomocą jednej z następujących instrukcji w Objective-C

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

lub Swift

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

Zobacz również przewodnik „ Przewijanie zawartości przewijania widoku ” firmy Apple .

Aby robić pokazy slajdów UIScrollView, układasz wszystkie obrazy w widoku przewijania, ustawiasz powtarzalny licznik czasu, a następnie -setContentOffset:animated:włącza się licznik czasu.

Ale bardziej wydajnym podejściem jest użycie 2 widoków obrazu i zamiana ich za pomocą przejść lub po prostu zamieniając się miejscami po uruchomieniu timera. Zobacz pokaz slajdów z obrazów iPhone'a, aby uzyskać szczegółowe informacje.

kennytm
źródło
1
Chłodny. Tak, zauważyłem, że setContentOffset działa, ale naprawdę chciałem, aby stało się to w animowany sposób. „animowany: TAK” załatwił sprawę.
climbon
3
Po prostu uzupełniając odpowiedź, aby przejść poziomo do następnej "strony" w UIScrollView (zakładając, że kodujesz dla iPhone'a), dla użycia parametru x (myScrollView.contentOffset.x +320).
Giovanni,
2
@niraj dzięki stary ... w (myScrollView.contentOffset.x +320)kłamstwie leży klucz!
D_D
5
Popraw mnie, jeśli się mylę, ale UIScrollView contentOffset:zrównoważy również contentSize, co może nie być pożądane. Aby tylko przewijać, możesz użyć scrollRectToVisible:.
Chris,
Nie używaj funkcji pomocniczych języka C, takich jak CGPointMakew Swift. Po prostu zbuduj strukturę Swift bezpośrednio:CGPoint(x: 0, y: 44)
Arnold,
42

Jeśli chcesz mieć kontrolę nad czasem trwania i stylem animacji, możesz:

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

Dostosuj czas trwania ( 2.0f) i opcje ( UIViewAnimationOptionCurveLinear) do smaku!

Jon Schneider
źródło
11

Innym sposobem jest

scrollView.contentOffset = CGPointMake(x,y);
Sohail Mohabbat Ali
źródło
14
To jest dokładnie to samo, co zaakceptowana odpowiedź. I CGPointpowinno CGPointMake.
Evan Mulawski
Lubię proste odpowiedzi, takie jak ta.
quemeful
W rzeczywistości to nie to samo, co zaakceptowana odpowiedź. Zaakceptowana odpowiedź ma opcję animacji, którą niektóre aplikacje mogą chcieć ustawić na TAK.
Rickster
11

Z animacją w języku Swift

scrollView.setContentOffset(CGPointMake(x, y), animated: true)
Michael
źródło
6

Jestem zdumiony, że ten temat ma 9 lat, a rzeczywistej prostej odpowiedzi tutaj nie ma!

To, czego szukasz, to scrollRectToVisible(_:animated:).

Przykład:

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

To, czego potrzebujesz, jest dokładnie tym, czego potrzebujesz i jest znacznie lepsze niż hacky contentOffset

Ta metoda przewija widok zawartości, tak aby obszar zdefiniowany przez rect jest widoczny tylko w widoku przewijania. Jeśli obszar jest już widoczny, metoda nic nie daje.

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

vol
źródło
3
scrollView.setContentOffset(CGPoint(x: y, y: x), animated: true)
CoderPug
źródło
3

Szybki 3

   let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
    scrollView.contentOffset = point
Alfi
źródło
2
[Scrollview setContentOffset:CGPointMake(x, y) animated:YES];
PJRadadiya
źródło
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
źródło
8
Proszę rozważyć dodanie tekstu do odpowiedzi, nie tylko
samego