1.常见代理方法
UIScrollView常见代理方法,放大缩小实例讲解实现。
1 #import "ViewController.h" 2 3 @interface ViewController ()<UIScrollViewDelegate> 4 @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; 5 @property (weak, nonatomic) IBOutlet UIImageView *image; 6 7 @end 8 9 @implementation ViewController 10 11 - (void)viewDidLoad { 12 [super viewDidLoad]; 13 _scrollView.delegate = self; 14 _scrollView.contentSize = CGSizeMake(1440, 900); 15 //设置放缩的比例 16 _scrollView.minimumZoomScale = 0.5; 17 _scrollView.maximumZoomScale = 2; 18 } 19 20 #pragma mark UIScrollViewDelegate 21 22 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ 23 NSLog(@"用户开始拖拽时调用"); 24 } 25 26 -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ 27 NSLog(@"具体滚动到某个位置时调用"); 28 NSLog(@"%@",NSStringFromCGPoint(_scrollView.contentOffset)); 29 } 30 31 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ 32 NSLog(@"停止拖拽时调用"); 33 } 34 35 -(void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view{ 36 NSLog(@"开始拖动"); 37 } 38 39 -(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{ 40 return _image; 41 } 42 43 -(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale{ 44 NSLog(@"正在拖动"); 45 } 46 47 @end
2综合运用,广告Banner
(1)首先加一个UIScrollView,设置320*200,再拖入一个UIPageControl在UIScrollView的上方,并设置当前颜色,和点的个数
代码,1.设置banner的contentSize确定滚动范围 2.将3张图片依次添加到banner中,只需处理x的坐标 3.banner的分页属性设置为YES
1 #import "ViewController.h" 2 3 @interface ViewController () 4 //滚动栏 5 @property (weak, nonatomic) IBOutlet UIScrollView *banner; 6 //分页 7 @property (weak, nonatomic) IBOutlet UIPageControl *pageContrl; 8 9 @end 10 11 @implementation ViewController 12 13 - (void)viewDidLoad { 14 [super viewDidLoad]; 15 //设置滚动范围 16 _banner.contentSize = CGSizeMake(320*3, 200); 17 //分页 18 _banner.pagingEnabled = YES; 19 //隐藏底部指示器 20 _banner.showsHorizontalScrollIndicator = NO; 21 //初始化图片 并添加到banner中 22 for(int i=0;i<3;i++){ 23 UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"image_%d.jpg",i+1]]]; 24 imageView.frame = CGRectMake(i*320, 0, 320, 200); 25 [_banner addSubview:imageView]; 26 } 27 }
效果
此时UIPageControl的点并不会随着图片的拖动变化而变化,要使U点跟着变化
1.实现UIScrollView的-(void)scrollViewDidScroll:(UIScrollView *)scrollView方法
2.在步骤1方法中通过banner的contentOffset获取移动的坐标,知道移动到了那里
3.通过(contentoffset.x + scrollView/2)/scrollView宽度算出页面
1 #import "ViewController.h" 2 3 @interface ViewController ()<UIScrollViewDelegate> 4 //滚动栏 5 @property (weak, nonatomic) IBOutlet UIScrollView *banner; 6 //分页 7 @property (weak, nonatomic) IBOutlet UIPageControl *pageContrl; 8 9 @end 10 11 @implementation ViewController 12 13 - (void)viewDidLoad { 14 [super viewDidLoad]; 15 //设置滚动范围 16 _banner.contentSize = CGSizeMake(320*3, 200); 17 //分页 18 _banner.pagingEnabled = YES; 19 //隐藏底部指示器 20 _banner.showsHorizontalScrollIndicator = NO; 21 //初始化图片 并添加到banner中 22 for(int i=0;i<3;i++){ 23 UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"image_%d.jpg",i+1]]]; 24 imageView.frame = CGRectMake(i*320, 0, 320, 200); 25 [_banner addSubview:imageView]; 26 } 27 //设置代理 28 _banner.delegate = self; 29 } 30 #pragma makr UIScrollViewDelegate 31 -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ 32 NSLog(@"正在滚动"); 33 //计算页面 34 //页码(contentoffset.x + scrollView宽度/2)/scrollView宽度,这里利用UIScrollView分页机制 35 CGFloat bannerW = _banner.frame.size.width; 36 CGFloat x = _banner.contentOffset.x; 37 //页码 38 int page = (x + bannerW/2)/bannerW; 39 _pageContrl.currentPage = page; 40 } 41 42 @end
很多时候需要我们进行自动滚动,可以通过NSTimer来实现,代码连接https://github.com/gurongkang/TestBanner
1 #import "ViewController.h" 2 3 @interface ViewController ()<UIScrollViewDelegate> 4 //滚动栏 5 @property (weak, nonatomic) IBOutlet UIScrollView *banner; 6 //分页 7 @property (weak, nonatomic) IBOutlet UIPageControl *pageContrl; 8 @end 9 10 @implementation ViewController{ 11 NSTimer *_timer; 12 } 13 14 /** 15 * @author 顾荣康, 15-10-16 15:10:47 16 * 17 * @brief 18 */ 19 - (void)viewDidLoad { 20 [super viewDidLoad]; 21 //设置滚动范围 22 _banner.contentSize = CGSizeMake(320*3, 200); 23 //分页 24 _banner.pagingEnabled = YES; 25 //隐藏底部指示器 26 _banner.showsHorizontalScrollIndicator = NO; 27 //初始化图片 并添加到banner中 28 for(int i=0;i<3;i++){ 29 UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"image_%d.jpg",i+1]]]; 30 imageView.frame = CGRectMake(i*320, 0, 320, 200); 31 [_banner addSubview:imageView]; 32 } 33 //设置代理 34 _banner.delegate = self; 35 //添加定时器 36 [self addTimer]; 37 } 38 #pragma makr UIScrollViewDelegate 39 40 41 /** 42 * @author 顾荣康, 15-10-16 15:10:11 43 * 44 * @brief 将要开始滚动 45 * 46 * @param scrollView 47 */ 48 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ 49 [self removeTimer]; 50 } 51 52 /** 53 * @author 顾荣康, 15-10-16 15:10:55 54 * 55 * @brief 正在滚动 56 * 57 * @param scrollView <#scrollView description#> 58 */ 59 -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ 60 NSLog(@"正在滚动"); 61 //计算页面 62 //页码(contentoffset.x + scrollView宽度/2)/scrollView宽度,这里利用UIScrollView分页机制 63 CGFloat bannerW = _banner.frame.size.width; 64 CGFloat x = _banner.contentOffset.x; 65 //页码 66 int page = (x + bannerW/2)/bannerW; 67 _pageContrl.currentPage = page; 68 69 } 70 71 /** 72 * @author 顾荣康, 15-10-16 15:10:25 73 * 74 * @brief 拖拽停止时 75 * 76 * @param scrollView 77 * @param decelerate 78 */ 79 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ 80 [self addTimer]; 81 } 82 83 /** 84 * @author 顾荣康, 15-10-16 15:10:08 85 * 86 * @brief 下一个图片 87 */ 88 -(void)nextImage{ 89 NSInteger page = self.pageContrl.currentPage; 90 if(page==2){ 91 page = 0; 92 }else{ 93 page++; 94 } 95 _banner.contentOffset = CGPointMake(page*320, 0); 96 97 } 98 99 /** 100 * @author 顾荣康, 15-10-16 14:10:51 101 * 102 * @brief 添加定时器 103 */ 104 -(void)addTimer{ 105 NSLog(@"添加定时器"); 106 _timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES]; 107 [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes]; 108 } 109 110 /** 111 * @author 顾荣康, 15-10-16 14:10:02 112 * 113 * @brief 去除定时器 114 */ 115 -(void)removeTimer{ 116 NSLog(@"去除定时器"); 117 if(_timer!=nil){ 118 [_timer invalidate]; 119 } 120 } 121 122 @end
swift纯代码实现https://github.com/gurongkang/TestBanner-swift
1 import UIKit 2 3 class ViewController: UIViewController,UIScrollViewDelegate { 4 5 //初始化banner 6 private var banner:UIScrollView = UIScrollView() 7 //UIPageControl 8 private var pageControl = UIPageControl(frame: CGRectMake(20, 180, 100, 20)) 9 private var timer:NSTimer! 10 //MARK: 生命周期 11 override func loadView() { 12 super.loadView() 13 //设置看见的范围 14 banner.frame = CGRectMake(0, 0, 320, 200) 15 //设置滚动范围 16 banner.contentSize = CGSizeMake(320*3, 200) 17 //分页 18 banner.pagingEnabled = true; 19 //隐藏底部指示器 20 banner.showsHorizontalScrollIndicator = false; 21 //添加到view 22 self.view.addSubview(banner) 23 //初始化图片 24 for(var i=0;i<3;i++){ 25 let imageView = UIImageView(image: UIImage(named: "image_\(i+1).jpg")) 26 imageView.frame = CGRectMake(CGFloat(i)*320, 0, 320, 200) 27 banner.addSubview(imageView) 28 } 29 pageControl.currentPage = 0 30 pageControl.numberOfPages = 3 31 self.view.addSubview(pageControl) 32 banner.delegate = self; 33 self.addTimer() 34 } 35 36 override func viewDidLoad() { 37 super.viewDidLoad() 38 } 39 40 override func didReceiveMemoryWarning() { 41 super.didReceiveMemoryWarning() 42 } 43 44 45 //MARK:UIScrollViewDelegate 46 /** 47 开始拖动 48 49 - parameter scrollView: 50 */ 51 func scrollViewWillBeginDragging(scrollView: UIScrollView) { 52 self.removeTimer() 53 } 54 55 func scrollViewDidScroll(scrollView: UIScrollView) { 56 let bannerW = banner.frame.size.width 57 let x = banner.contentOffset.x 58 let page = (x + bannerW/2)/bannerW 59 pageControl.currentPage = Int(page); 60 } 61 62 func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) { 63 self.addTimer() 64 } 65 66 //MARK:定时器 67 /** 68 添加定时器 69 */ 70 func addTimer(){ 71 print("添加定时器") 72 timer = NSTimer(timeInterval: 1.0, target: self, selector: "nextImage", userInfo: nil, repeats: true) 73 NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 74 } 75 76 /** 77 去除定时器 78 */ 79 func removeTimer(){ 80 print("去除定时器") 81 timer.invalidate() 82 } 83 //MARK: 业务方法 84 /** 85 下一张图片 86 */ 87 func nextImage(){ 88 var page = self.pageControl.currentPage 89 if(page==2){ 90 page = 0 91 }else{ 92 page++ 93 } 94 banner.contentOffset = CGPointMake(CGFloat(page)*320, 0) 95 } 96 }