Programmatically scroll a UIScrollView

前端 未结 9 1019
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-29 15:52

I have a UIScrollView which has several views. When a user flicks their finger, the view scrolls to the right or left depending on the direction of the finger f

相关标签:
9条回答
  • 2020-11-29 16:05
    scrollView.setContentOffset(CGPoint(x: y, y: x), animated: true)
    
    0 讨论(0)
  • 2020-11-29 16:09

    Swift 3

       let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
        scrollView.contentOffset = point
    
    0 讨论(0)
  • 2020-11-29 16:12

    I'm amazed that this topic is 9 years old and the actual straightforward answer is not here!

    What you're looking for is scrollRectToVisible(_:animated:).

    Example:

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

    What it does is exactly what you need, and it's far better than hacky contentOffset

    This method scrolls the content view so that the area defined by rect is just visible inside the scroll view. If the area is already visible, the method does nothing.

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

    0 讨论(0)
  • 2020-11-29 16:13
    - (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);
             }
         }];
    }
    
    0 讨论(0)
  • 2020-11-29 16:15

    If you want control over the duration and style of the animation, you can do:

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

    Adjust the duration (2.0f) and options (UIViewAnimationOptionCurveLinear) to taste!

    0 讨论(0)
  • 2020-11-29 16:17
    [Scrollview setContentOffset:CGPointMake(x, y) animated:YES];
    
    0 讨论(0)
提交回复
热议问题