您的位置:首页 > 产品设计 > UI/UE

UIScrollView的代理【图片缩放】

2015-12-08 20:16 447 查看

(一)UIScrollView的代理(delegate)

delegate是UIScrollView内部的一个属性

@property(nullable,nonatomic,weak) id<UIScrollViewDelegate>delegate;                       // default nil. weak reference


从这里我们可以看到,UIScrollView的代理必须遵守UIScrollViewDelegat协议,也就是说,要做UIScrollView的代理,必须要有UIScrollViewDelegat协议里面的方法。

在UIScrollView正在滚动 或 滚动到某个位置 或者 停止滚动 时做一些特定的操作,要想完成上述功能,前提条件就是能够监听到UIScrollView的整个滚动过程。

当UIScrollView发生一系列的滚动操作时, 会自动通知它的代理(delegate)对象,给它的代理发送相应的消息(在OC中,发消息就是调方法),让代理得知它的滚动情况,也就是说,要想监听UIScrollView的滚动过程,就必须先给UIScrollView设置一个代理对象,然后通过代理得知UIScrollView的滚动过程。

1. UIScrollView和delegate的通信

MJ老师做的图片非常形象:



我们知道,在OC中,发消息就是调方法,因此UIScrollView和delegate的通信可以理解为下图所示



再精确一点,UIScrollView和delegate的通信应该为下图所示



右边的delegate要想监听UIScrollView的滚动必须要有上面的三个方法,所以要对delegate进行约束,怎么约束呢,把上面的三个方法放到UIScrollViewDelegate协议里面去,要想成为UIScrollView的代理,必须遵守这个协议,既实现这个协议里面的方法。

UIScrollView将delegate需要实现的方法都定义在了UIScrollViewDelegate协议中,因此要想成为UIScrollView的delegate,必须遵守UIScrollViewDelegate协议,然后实现协议中相应的方法,就可以监听UIScrollView的滚动过程了。

这里我们可以这样理解:把UIScrollView和delegate看成两个人,这两个人要想交流,必须会同一门语言。这里协议UIScrollViewDelegat就约束了这两个人会同一门语言,可以交流。



2. 怎样设置UIScrollView的delegate

1.一般情况下,就设置UIScrollView所在的控制器为UIScrollView的delegate。设置控制器为UIScrollView的delegate有2种方法。

通过代码(self就是控制器)

self.scrollView.delegate = self;


通过storyboard拖线

2.控制器应该遵守UIScrollViewDelegate协议

#import "ViewController.h"

@interface MJViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *minionView;
@end


3.实现协议中定义的相关方法

下面为几个常用的方法

开始拖拽的时候调用

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView


只要scrollView正在滚动,就会调用

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@"正在滚动%@", NSStringFromCGPoint(scrollView.contentOffset));
}


结束拖拽时调用

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;


3. 代理设计模式的作用

监听的思想

让一个对象A监听另一个对象B的状态。

通知的思想

一个对象B状态发生了变化 (做了一些事情)想通知另一个对象A

(二)UIScrollView的缩放

UIScrollView不仅能滚动显示大量内容,还能对其内容进行缩放处理。也就是说,要完成缩放功能的话,只需要将需要缩放的内容添加到UIScrollView中。

1. 缩放原理

当用户在UIScrollView身上使用捏合手势时,UIScrollView会给代理发送一条消息,询问代理究竟要缩放自己内部的哪一个子控件(哪一块内容)。

ScrollView一次只能缩放一个子控件。

为什么要给代理发消息?

在UIScrollView身上使用捏合手势时,ScrollView可能有多个子控件,它并不知道缩放哪一个,它要问代理缩放那个子控件。

当用户在UIScrollView身上使用捏合手势时,UIScrollView会调用代理的viewForZoomingInScrollView:方法,这个方法返回的控件就是需要进行缩放的控件。



2. 常用方法

注意:要实现缩放,首先要设置最大和最小的缩放比例

self.scrollView.maximumZoomScale = 2.0;
self.scrollView.minimumZoomScale = 0.2;


1 . 当用户使用捏合手势的时候会调用

/**
*  @return 返回的控件就是需要进行缩放的控件
*/
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
NSLog(@"----开始缩放");
return self.minionView;
}


2 . 正在缩放的时候会调用

- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
NSLog(@"----正在缩放");
}


3 . 缩放完毕的时候调用

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view


(三)完整代码

#import "ViewController.h"

@interface ViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *minionView;
// minionView为需要缩放的内容,添加到scrollView
@end
// 代理 \ 委托

@implementation MJViewController

- (void)viewDidLoad
{
[super viewDidLoad];

// 设置内容尺寸
self.scrollView.contentSize = self.minionView.frame.size;

// 设置
self.scrollView.delegate = self;

// 设置最大和最小的缩放比例
self.scrollView.maximumZoomScale = 2.0;
self.scrollView.minimumZoomScale = 0.2;
}

/**
* 当用户开始拖拽scrollView时就会调用
*/
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
NSLog(@"开始拖拽-----");
}

/**
* 只要scrollView正在滚动,就会调用
*/
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@"----正在滚动--%@", NSStringFromCGPoint(scrollView.contentOffset));
}

/**
* 当用户使用捏合手势的时候会调用
*
* @return 返回的控件就是需要进行缩放的控件
*/
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
NSLog(@"----开始缩放");
return self.minionView;
}

/**
* 正在缩放的时候会调用
*/
- (void)scrollViewDidZoom:(UIScrollView *)scrollView { NSLog(@"----正在缩放"); }

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uiscrollview delegate