以编程方式滚动UIScrollView

179

我有一个带有多个视图的UIScrollView。当用户用手指轻扫屏幕时,视图会根据轻扫的方向向右或向左滚动。基本上,我的代码与iPhone照片应用程序类似。现在,有没有一种方法可以通过编程方式做同样的事情,以便我最终得到一个幻灯片演示文稿,只需点击一个按钮,并且可以配置每次滚动之间的暂停时间?

如何使用UIScrollView制作幻灯片演示文稿?

10个回答

425

你可以使用以下Objective-C语句之一,在滚动视图中滚动到某个点:

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

或者Swift

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

参考 Apple 的《滚动滚动视图内容》指南,学习使用 UIScrollView 制作幻灯片。

制作幻灯片的方法是将所有图片排列在滚动视图中,设置重复定时器,然后在定时器触发时使用-setContentOffset:animated:方法来滚动视图。

但效率更高的方法是使用两个图像视图并在计时器触发时进行过渡或简单地切换它们的位置。详情请参见iPhone 图像幻灯片


1
很好。是的,我发现setContentOffset可以工作,但真的希望以动画方式发生。 "animated:YES"就解决了问题。 - climbon
3
补充一下回答,如果你正在编写 iPhone 的 UIScrollView 并想要水平移动到下一个“页面”,则可以将 x 参数设置为(myScrollView.contentOffset.x +320) - Giovanni
2
@niraj 谢谢老兄...关键在于 (myScrollView.contentOffset.x +320) - DD_
5
еҰӮжһңжҲ‘й”ҷдәҶпјҢиҜ·зә жӯЈжҲ‘пјҢдҪҶжҳҜUIScrollViewзҡ„contentOffset:дјҡеҗҢж—¶еҒҸ移contentSizeпјҢиҝҷеҸҜиғҪдёҚжҳҜжҲ‘们жғіиҰҒзҡ„гҖӮеҰӮжһңеҸӘжғіж»ҡеҠЁеҶ…е®№пјҢдҪ еҸҜиғҪйңҖиҰҒдҪҝз”ЁscrollRectToVisible:гҖӮ - Chris
在Swift中不要使用C助手函数,例如CGPointMake。直接构建一个Swift结构体:CGPoint(x: 0, y: 44) - Arnold
[scrollView scrollRectToVisible:CGRectMake(x, y, width, height), animated:YES]; 当我添加这个时,它最初会稍微向上滚动。@kennytm,你能给我一个解决方法吗? - Abhishek Thapliyal

42

如果您想控制动画的持续时间和样式,可以这样做:

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

根据个人口味调整持续时间 (2.0f) 和选项 (UIViewAnimationOptionCurveLinear)!


20

我很惊讶这个主题已经有9年历史了,而真正简单明了的答案还没有出现!

你要找的是scrollRectToVisible(_:animated:)

示例:

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

它所做的正是您需要的,而且比使用hacky contentOffset的方法要好得多。

该方法滚动内容视图,以便定义为矩形的区域刚好可见于滚动视图内。如果该区域已经可见,则该方法不执行操作。

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


1
好的解决方案,但是contentOffset可以更精确地控制你想要滚动到哪里。 - Abdurakhmon

12

另一种方法是

scrollView.contentOffset = CGPointMake(x,y);

14
这与已接受的答案完全相同。CGPoint 应更改为 CGPointMake - Evan Mulawski
我喜欢像这样简单的答案。 - quemeful
实际上,这与被接受的答案不同。被接受的答案有一个动画选项,一些应用程序可能希望将其设置为“是”。 - Rickster

11

使用 Swift 进行动画

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

6

Swift 3

let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
scrollView.contentOffset = point

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

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

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);
         }
     }];
}

9
请考虑在您的回答中添加一些文本,而不仅仅是纯代码。 - user1781290

-1

这是另一个对我很有效的用例。

  1. 用户点击按钮/单元格。
  2. 滚动到足以使目标视图可见的位置。

代码:Swift 5.3

// Assuming you have a view named "targeView"
scrollView.scroll(to: CGPoint(x:targeView.frame.minX, y:targeView.frame.minY), animated: true)

如果你想滚动以使目标视图的底部可见,则使用maxX和minY。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接