UIScrollView的代理【图片缩放】

(一)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老师做的图片非常形象:
UIScrollView和delegate的通信1
我们知道,在OC中,发消息就是调方法,因此UIScrollView和delegate的通信可以理解为下图所示
UIScrollView和delegate的通信2
再精确一点,UIScrollView和delegate的通信应该为下图所示
UIScrollView和delegate的通信3

  • 右边的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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值