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?

memanjat
sumber

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.

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

Jon Schneider
sumber
11

Cara lain adalah

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

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

Cepat 3

   let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
    scrollView.contentOffset = point
Alfi
sumber
2
[Scrollview setContentOffset:CGPointMake(x, y) animated:YES];
PJRadadiya
sumber
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
sumber
8
Harap pertimbangkan untuk menambahkan beberapa teks ke jawaban Anda, tidak hanya kode murni
user1781290