以编程方式滚动UIScrollView


159

我有一个 UIScrollView其中有几种看法。当用户轻弹手指时,视图会根据手指轻拂的方向向右或向左滚动。基本上,我的代码的工作方式类似于iPhone照片应用程序。现在,是否有一种方法可以通过编程方式执行相同的操作,从而使我最终获得一个幻灯片显示,该幻灯片显示可以通过单击按钮并在每次滚动之间进行可配置的暂停而独立运行?

您如何真正进行幻灯片放映UIScrollView

Answers:


391

您可以使用Objective-C中的以下语句之一滚动到滚动视图中的某个点

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

或Swift

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

也请参见Apple指南“ 滚动滚动查看内容

要使用进行幻灯片放映UIScrollView,您可以在滚动视图中排列所有图像,设置一个重复的计时器,然后-setContentOffset:animated:在计时器启动时。

但是更有效的方法是使用2个图像视图,并使用过渡或在计时器触发时仅切换位置来交换它们。有关详细信息,请参见iPhone图像幻灯片


1
凉。是的,我确实发现setContentOffset可以工作,但我确实希望这可以动画方式发生。“动画:是”成功了。
2010年

3
只需补充答案,即可水平移动到UIScrollView中的下一个“页面”(假设您正在为iPhone编写代码),以使用x参数(myScrollView.contentOffset.x +320)
Giovanni

2
@niraj谢谢花花公子...在(myScrollView.contentOffset.x +320)关键!
D_D

5
如果我错了,请纠正我,但是UIScrollView contentOffset:也会补偿contentSize,这可能不是理想的。要仅滚动,您可能需要使用scrollRectToVisible:
克里斯,

不要像CGPointMakeSwift中那样使用C helper函数。只需直接构建一个Swift结构:CGPoint(x: 0, y: 44)
Arnold

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
埃文·穆拉斯基

我喜欢这样的简单答案。
2015年

实际上,这与接受的答案不同。接受的答案具有动画选项,某些应用程序可能希望将其设置为“是”。
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)
    }
}

它所做的正是您所需要的,并且比hacky更好 contentOffset

此方法滚动内容视图,以便由rect定义的区域仅在滚动视图内部可见。如果该区域已经可见,则该方法不执行任何操作。

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


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

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 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.