◇先来介绍一下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 }