プログラムでUIScrollViewをスクロールする


159

UIScrollViewはいくつかの見解を持っています。ユーザーが指をフリックすると、指のフリックの方向に応じてビューが右または左にスクロールします。基本的に、私のコードはiPhoneの写真アプリと同じように機能します。プログラムで同じことを実行して、ボタンをクリックするだけでスライドショーが実行され、各スクロールの間に構成可能な一時停止ができるようにする方法はありますか。

どのようにして実際にスライドショーを行いUIScrollViewますか?

回答:


391

Objective-Cの以下のステートメントのいずれかを使用して、スクロールビューのあるポイントまでスクロールできます。

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

またはスウィフト

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

Appleの「Scroll View Contentガイドも参照してください

でスライドショーを行うにはUIScrollView、すべての画像をスクロールビューに配置し、繰り返しタイマーを設定してから-setContentOffset:animated:、タイマーが作動するようにします。

しかし、より効率的なアプローチは、2つの画像ビューを使用し、遷移を使用してそれらを交換するか、タイマーが作動したときに単に場所を切り替えることです。詳細については、iPhone画像のスライドショーを参照してください。


1
涼しい。はい、私はsetContentOffsetが機能することを見つけましたが、これがアニメーションで発生することを本当に望んでいました。'animated:YES'がトリックを行いました。
2010

3
答えを補足するだけで、UIパラメータで次の「ページ」に水平に移動するには(iPhone向けにコーディングしていると想定)、xパラメータを使用します(myScrollView.contentOffset.x +320)
Giovanni

2
@nirajありがとうおい... (myScrollView.contentOffset.x +320)キーが嘘です!
D_D 2013

5
私が間違っている場合は修正してください。ただし、UIScrollView contentOffset:はcontentSizeもオフセットするため、望ましくない場合があります。スクロールのみを行うには、を使用しますscrollRectToVisible:
Chris

CGPointMakeSwiftのようにCヘルパー関数を使用しないでください。単に直接スウィフト構造体を構築する:CGPoint(x: 0, y: 44)
アーノルド

42

アニメーションの継続時間とスタイルを制御したい場合は、次の操作を実行できます。

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

持続時間(2.0f)とオプション(UIViewAnimationOptionCurveLinear)を調整して味わってください!


11

別の方法は

scrollView.contentOffset = CGPointMake(x,y);

14
これは、受け入れられた回答とまったく同じです。とするCGPoint必要がありますCGPointMake
エヴァンMulawski

私はこのような簡単な答えが好きです。
2015

実際、これは受け入れられた答えと同じではありません。承認された回答にはアニメーションのオプションがあり、一部のアプリではYESに設定する必要があります。
Rickster

11

Swiftのアニメーション

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

6

このトピックが9歳で、実際の簡単な答えはここにないことに驚いています。

あなたが探しているのはscrollRectToVisible(_:animated:)です。

例:

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

それがすることはまさにあなたが必要とすることであり、それはハッキーよりもはるかに優れています contentOffset

このメソッドはコンテンツビューをスクロールして、rectで定義された領域がスクロールビュー内に表示されるようにします。領域がすでに表示されている場合、メソッドは何もしません。

送信元:https : //developer.apple.com/documentation/uikit/uiscrollview/1619439-scrollrecttovisible



3

スウィフト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
純粋なコードだけでなく、回答にテキストを追加することを検討してください
user1781290
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.