免费开源的iOS开发学习平台

UIScrollView滚动视图:2-常用代理方法的实现

在实际开发时,我们需要在屏幕的滚动动作中监控滚动的行为动作,例如,在开始滚动、滚动过程中以及结束滚动等这些不同的时刻做些特定的操作,来实现一些功能。此时,我们就需要使用代理来监控UIScrollView的整个滚动过程。

UIScrollViewDelegate简介

UIScrollViewDelegate是UIScrollView的代理协议,通过其中定义的代理方法,即可监听在用户交互过程中的不同动作。在调用UIScrollViewDelegate中的方法前,需要提前将UIScrollView对象的代理设置完成,系统会在特定的时机,自动调用代理对象的响应方法,即发送特定的消息给代理,代理来完成相应工作。

UIScrollViewDelegate中的常用方法

目前UIScrollView共有13个代理方法,但是在实际开发中并不会都用到,这里我们主要讲其中三个方法。

  • 当滚动时不断调用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
  • 即将开始滚动时调用
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; 
  • 手指离开屏幕,停止滚动时调用
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate; 

UIScrollViewDelegate的实现方法

UIScrollViewDelegate的实现方法与其他代理协议的实现方法是完全一致的,主要包括3个步骤:

  1. 遵守代理协议。谁遵守了这个协议,谁就是UIScrollView的代理,一般情况下,我们会设置控制器类作为滚动视图的代理。

  2. 设置代理属性

  3. 根据程序功能的需要,实现相应的代理方法。

示例代码

下方的示例代码指定控制器类为UIScrollView对象的代理,并且可以监听用户在UIScrollView上进行的交互操作。

  • 创建一个Single View Application工程,并导入一张名为image的图片,图片的大小尽量大一些

  • 设置ViewController类遵守UIScrollViewDelegate协议

@interface ViewController () <UIScrollViewDelegate>
  • 在ViewDidLoad中添加如下代码,设置UIScrollView的属性并且指定其代理对象
- (void)viewDidLoad {
    [super viewDidLoad];
    //创建一个UIImageView对象
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];
    //创建一个与屏幕等宽等高的滚动视图
    UIScrollView *myScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    //设置滚动区域的大小
    myScrollView.contentSize = imageView.bounds.size;
    //指定其代理对象
    myScrollView.delegate = self;
    //添加子视图
    [myScrollView addSubview:imageView];
    [self.view addSubview:myScrollView];
}
  • 实现UIScrollViewDelegate中的方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSLog(@"滚动时,调用scrollViewDidScroll: 方法");
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    NSLog(@"即将开始滚动时,调用scrollViewWillBeginDragging: 方法");
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    NSLog(@"停止滚动时,调用scrollViewDidEndDragging: 方法");
}

运行结果如下,当用户对滚动视图进行滑动时,UIScrollViewDelegate中对应的方法会被调用。

示例代码

https://github.com/99ios/8.1.2