(3) IOS笔记本——UIScrollView的其他应用

◇先来介绍一下UIScrollView的代理:

1.很多时候,我们想在UIscrollView正在滚动或者滚动到某个位置或者停止滚动时做一些特定的操作。

2.想要完成上述的功能,前提条件是能够监听到UIscrollView的整个滚动过程。

3.当UIScrollView发生一系列的滚动操作时,会自动通知它的代理(delegate)对象,给它的代理发送相应的消息,让代理得知它的滚动情况。

4.UIScrollView和delegate的通信如下图所示

         

5.若想成为UIScrollView的代理,则必须遵守UIScrollView的协议。简而言之,成为delegate的条件:UIScrollView将delegate需要实现的方法都定义在UIScrollViewDelegate协议中,因此想成为UIScrollView的delegate,就必须遵守UIScrollViewDelegate协议,然后实现协议中对应的方法,就可以监听UIScrollView的滚动过程了。

6.UIScrollView和控制器

(1)一般情况下,把UIScrollView所在的控制器设置成UIScrollView的delegate。

(2)设置控制器为UIScrollView的delegate有2种方法:一是通过代码的方式(self就是控制器)self.scrollView.delegate = self.

二是通过storyboard的拖线。

7.代理的用途:

(1)监听的思想:让一个对象A监听另一个对象B的状态。(则A为B的代理)

(2)通知的思想:一个对象B状态发生了改变(做了某些事情),想通知另一个对象A

8.UIScrollView的缩放原理

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

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

◇代理有很多作用, 其中一种作用就是控制UIScrollView的缩放的,一般步骤就是三种:

  ◇1、准守协议

@interface ViewController () <UIScrollViewDelegate> 

  2、实现协议

 1 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
 2 {
 3     NSLog(@"开始拖拽了~~!~!~!");
 4 }
 5 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
 6 {
 7     NSLog(@"开始缩放~!~!~!~~~~~~~~~~~~");
 8     return self.UIImageView;
 9 }
10 - (void)scrollViewDidZoom:(UIScrollView *)scrollView
11 {
12     NSLog(@"正在缩放~!~!~!~!~!~!~!~!~!~!");
13 }

  3、设置代理

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     self.UIScrollView.contentSize = self.UIImageView.image.size;
 4     self.UIScrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
 5     //设置代理为控制器本身
 6     self.UIScrollView.delegate = self;
 7     //设置缩放大小比例
 8     self.UIScrollView.maximumZoomScale = 2.0;
 9     self.UIScrollView.minimumZoomScale = 0.2;
10 }

 ◇第二个应用----图片轮播

  ◇图片轮播我们一点儿都不陌生,来看看效果图,(注意图中的下面几个小点):

                                       

  ◇该应用用到的几个技术:

    ◇1、添加图片(利用for循环在UIScrollView中添加图片)

    ◇2、设置分页

    ◇3、利用定时器,定时播放下一张图片

  ◇基于上面几个步骤,来看看具体的实现:

    ◇1、添加图片

 1     //添加图片
 2     for (int i = 0; i <= XWXImageCount ; i++) {        
 5         NSString *name = [NSString stringWithFormat:@"img_0%d",i + 1];
 6         UIImageView *image = [[UIImageView alloc] init];
 7         image.image = [UIImage imageNamed:name];
 8         
 9         image.frame = CGRectMake(i * imageW, imageY, imageW, imageH);
10          
11         [self.scrollView addSubview:image];
12     }

    ◇2、设置分页

1     //允许分页,设置分页点数
2     self.scrollView.pagingEnabled = YES;
3     self.pageControl.numberOfPages = XWXImageCount;

    ◇3、设置定时器

 1 //启动定时器
 2 - (void)addTimer{
 3     self.timer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(nextImg) userInfo:nil repeats:YES];
 4     [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
 5 }
 6 
 7 //下一张图片
 8 - (void)nextImg{
 9     // 1.增加pageControl的页码
10     int page = self.pageControl.currentPage;
11     if (page == XWXImageCount - 1) {
12         page = 0;
13     } else {
14         page = self.pageControl.currentPage + 1;
15     }
16     
17     // 2.计算scrollView滚动的位置
18     CGFloat offsetX = page * self.scrollView.frame.size.width;
19     CGPoint offset = CGPointMake(offsetX, 0);
20     [self.scrollView setContentOffset:offset animated:YES];
21     
22     [self.scrollView setContentOffset:offset animated:YES];
23 }
24 //停止定时器
25 - (void)removeTimer
26 {
27     [self.timer invalidate];
28     self.timer = nil;
29 }

    ◇另外一个要注意的,在拖拽图片的时候,需要停止定时器,在定制拖拽图片的时候,要重新启动定时器,我们可以利用UIScollView的协议来实现。

 1 -(void)scrollViewDidScroll:(UIScrollView *)scrollView{
 2    
 3     int page =  scrollView.contentOffset.x / scrollView.frame.size.width;
 4     self.pageControl.currentPage = page;
 5 }
 6 
 7 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
 8     [self removeTimer];
 9 }
10 
11 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
12     [self addTimer];
13 }

    

原文地址:https://www.cnblogs.com/kaolalovemiaomiao/p/5245942.html