Gulir secara terprogram UIScrollView


159

Saya punya UIScrollViewyang memiliki beberapa pandangan. Saat pengguna menjentikkan jari mereka, tampilan akan menggulir ke kanan atau kiri tergantung pada arah jentikan jari. Pada dasarnya kode saya bekerja dengan cara yang mirip dengan aplikasi foto iPhone. Sekarang, apakah ada cara agar saya dapat melakukan hal yang sama secara terprogram sehingga saya berakhir dengan tampilan slide yang berjalan sendiri dengan mengklik tombol dan jeda yang dapat dikonfigurasi antara setiap gulir?

Bagaimana Anda melakukan tayangan slide UIScrollView?

Jawaban:


391

Anda dapat menggulir ke beberapa titik dalam tampilan gulir dengan salah satu pernyataan berikut di Objective-C

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

atau Swift

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

Lihat panduan " Menggulir Konten Lihat Gulir " dari Apple juga .

Untuk melakukan rangkai salindia UIScrollView, Anda mengatur semua gambar dalam tampilan gulir, mengatur penghitung waktu berulang, kemudian -setContentOffset:animated:saat penghitung waktu menyala.

Tetapi pendekatan yang lebih efisien adalah dengan menggunakan 2 tampilan gambar dan menukar mereka menggunakan transisi atau hanya berpindah tempat ketika timer menyala. Lihat tayangan slide Gambar iPhone untuk detailnya.


1
Keren. Ya, saya memang menemukan bahwa setContentOffset berfungsi tetapi benar-benar ingin ini terjadi dengan cara animasi. 'Dihidupkan: YA' berhasil.
pendakian

3
Hanya melengkapi jawaban, untuk berpindah secara horizontal ke "halaman" berikutnya di UIScrollView (dengan asumsi Anda sedang mengkode untuk iPhone), untuk penggunaan parameter x (myScrollView.contentOffset.x +320).
Giovanni

2
@ niraj terima kasih Bung ... di (myScrollView.contentOffset.x +320)kuncinya!
D_D

5
Perbaiki saya jika saya salah, tetapi UIScrollView contentOffset:akan mengimbangi contentSize juga, yang mungkin tidak diinginkan. Untuk hanya menggulir, Anda mungkin ingin menggunakan scrollRectToVisible:.
Chris

Jangan gunakan fungsi pembantu C seperti CGPointMakedi Swift. Cukup bangun langsung Swift struct:CGPoint(x: 0, y: 44)
Arnold

42

Jika Anda ingin mengontrol durasi dan gaya animasi, Anda dapat melakukan:

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

Sesuaikan durasi ( 2.0f) dan opsi ( UIViewAnimationOptionCurveLinear) sesuai selera!


11

Cara lain adalah

scrollView.contentOffset = CGPointMake(x,y);

14
Ini persis sama dengan jawaban yang diterima. Dan CGPointseharusnya CGPointMake.
Evan Mulawski

Saya suka jawaban sederhana seperti ini.
Uniknya

Sebenarnya, ini tidak sama dengan jawaban yang diterima. Jawaban yang diterima memiliki opsi animasi, yang beberapa aplikasi mungkin ingin atur ke YA.
Rickster

11

Dengan Animasi dalam Swift

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

6

Saya kagum bahwa topik ini berusia 9 tahun dan jawaban langsung yang sebenarnya tidak ada di sini!

Yang Anda cari adalah scrollRectToVisible(_:animated:).

Contoh:

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

Apa yang dilakukannya persis seperti yang Anda butuhkan, dan itu jauh lebih baik daripada meretas contentOffset

Metode ini menggulir tampilan konten sehingga area yang ditentukan oleh persegi hanya terlihat di dalam tampilan gulir. Jika area sudah terlihat, metode tidak melakukan apa-apa.

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


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

3

Cepat 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
Harap pertimbangkan untuk menambahkan beberapa teks ke jawaban Anda, tidak hanya kode murni
user1781290
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.