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
相关文章推荐
- C#使用委托(delegate)实现在两个form之间传递数据的方法
- Query中click(),bind(),live(),delegate()的区别
- jQuery中 delegate使用的问题
- 浅谈jquery中delegate()与live()
- 由点击页面其它地方隐藏div所想到的jQuery的delegate
- jQuery中delegate与on的用法与区别示例介绍
- JS delegate与live浅析
- jQuery事件 delegate()使用方法介绍
- .NET笔记之:Delegate内部原理的分析
- C#匿名方法与Delegate类型转换错误分析
- jQuery中delegate和on的用法与区别详细解析
- 顶部可滚动小广告位 的封装 (UIScrollView+PageControl)
- iOS中jQuery 的delegate 事件监听无效解决办法
- iOS页面传值总结
- UITextField常用delegate
- ios7 中关于导航切换影响UIScrollView的问题
- 两个UIScrollVIew能够同步滚动
- UIScrollview要加载大量数据的时候,考虑到内存的消耗问题,我们不可能全部加载完。
- 试说明在C#中Delegate类的使用
- delegate 委托的使用