Programlı olarak bir UIScrollView kaydırın


159

Ben UIScrollViewbirkaç görünümleri olan bir var. Bir kullanıcı parmağını hareket ettirdiğinde, parmak hareketinin yönüne bağlı olarak görünüm sağa veya sola kayar. Temelde kodum iPhone fotoğraf uygulamasına benzer bir şekilde çalışıyor. Şimdi, programlı olarak aynı şeyi yapabilmemin bir yolu var, böylece her bir kaydırma ile bir düğme tıklaması ve yapılandırılabilir bir duraklama ile kendi başına çalışan bir slayt gösterisi elde edeceğim?

Slayt gösterilerini gerçekten nasıl yapıyorsunuz UIScrollView?

Yanıtlar:


391

Objective-C'de aşağıdaki ifadelerden biriyle kaydırma görünümünde bir noktaya ilerleyebilirsiniz.

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

veya Swift

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

Apple'ın da " Kaydırma Görünümü İçeriğini Kaydırma " kılavuzuna bakın .

İle slayt gösterileri yapmak için UIScrollView, kaydırma görünümündeki tüm görüntüleri düzenler, tekrarlanan bir zamanlayıcı ayarlar, sonra -setContentOffset:animated:zamanlayıcı patladığında.

Ancak daha verimli bir yaklaşım, 2 görüntü görünümünü kullanmak ve geçişleri kullanarak veya zamanlayıcı patladığında yerleri değiştirmekle değiştirmektir. Ayrıntılar için iPhone Resim slayt gösterisine bakın.


1
Güzel. Evet, setContentOffset'in çalıştığını buldum, ancak bunun animasyonlu bir şekilde olmasını istedim. 'animated: YES' hile yaptı.
climbon

3
Cevabı tamamlayarak, x parametresi kullanımı için UIScrollView (iPhone için kodlama yaptığınızı varsayarak) içindeki bir sonraki "sayfaya" yatay olarak geçmek için (myScrollView.contentOffset.x +320).
Giovanni

2
@niraj teşekkürler dostum ... içinde (myScrollView.contentOffset.x +320)yatıyor anahtar!
D_D

5
Yanılıyorsam beni düzeltin, ancak UIScrollView's contentOffset:, contentSize'i de dengeleyecek ve bu istenmeyebilir. Yalnızca kaydırmak için kullanmak isteyebilirsiniz scrollRectToVisible:.
Chris

CGPointMakeSwift gibi C yardımcı işlevlerini kullanmayın . Doğrudan bir Swift yapısı inşa et:CGPoint(x: 0, y: 44)
Arnold

42

Animasyonun süresi ve stili üzerinde kontrol istiyorsanız, şunları yapabilirsiniz:

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

Tatmak için süreyi ( 2.0f) ve seçenekleri ( UIViewAnimationOptionCurveLinear) ayarlayın !


11

Başka bir yol

scrollView.contentOffset = CGPointMake(x,y);

14
Bu, kabul edilen cevapla tamamen aynıdır. Ve CGPointolmalı CGPointMake.
Evan Mulawski

Bunun gibi basit cevapları severim.
quemeful

Aslında bu kabul edilen cevapla aynı değil. Kabul edilen cevapta bazı uygulamaların EVET olarak ayarlamak isteyebileceği bir animasyon seçeneği vardır.
Rickster

11

Swift'te Animasyon ile

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

6

Bu konunun 9 yaşında olduğuna ve gerçek açık cevabın burada olmadığına şaşırdım!

Aradığın şey scrollRectToVisible(_:animated:).

Misal:

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

Yaptığı şey tam olarak ihtiyacınız olan şey ve hacky'den çok daha iyi contentOffset

Bu yöntem, içerik görünümünü, rect tarafından tanımlanan alanın kaydırma görünümünde görünecek şekilde kaydırır. Alan zaten görünürse, yöntem hiçbir şey yapmaz.

Gönderen: https://developer.apple.com/documentation/uikit/uiscrollview/1619439-scrollrecttovisible


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

3

Hızlı 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
Lütfen sadece kodunuza değil, cevabınıza bir miktar metin eklemeyi düşünün
user1781290
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.