要让一组视图View一起滚动,就需要滚动视图。在Android上提供了ScrollView,而iOS则提供了UIScrollView。UIScrollView比Android上的ScrollView多出3种特性:
前2个特性是Android项目中一直费尽心思想实现的功能,但都不理想,或者还有手势冲突等问题。第三个特性一般用ViewPager来做,而不是用ScrollView,并且还自带复用功能。那UIScrollView可以算是没有复用功能的ViewPager了。本篇就来看看这个牛逼的UIScrollView吧。
#import "ViewController.h" @interface ViewController () /** * 滚动视图 */ @property(retain,nonatomic) UIScrollView* scrollView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //获取控制器View的宽、高 CGFloat vcViewWidth = self.view.frame.size.width; CGFloat vcViewHeight = self.view.frame.size.height; //创建UIScrollView _scrollView = [[UIScrollView alloc] init]; //设置UIScrollView的位置和宽高为控制器View的宽高 _scrollView.frame = CGRectMake(0, 0, vcViewWidth, vcViewHeight); //设置画布大小,一般比frame大,这里设置横向能拖动4张图片的范围 _scrollView.contentSize = CGSizeMake(vcViewWidth * 4, vcViewHeight); //将ScrollView添加到控制器的View上 [self.view addSubview:_scrollView]; } @end 复制代码
经过上面的设置,我们的UIScrollView已经添加到屏幕中了,但是还没有内容,接下来我们给UIScrollView添加4张图片,分别横向排列。
//创建图片ImageView添加到ScrollView中 for(int i = 0; i < 4; i++) { NSString* imgName = [NSString stringWithFormat:@"%d.jpg", i + 1]; UIImage* img = [UIImage imageNamed:imgName]; UIImageView* imgView = [[UIImageView alloc] initWithImage:img]; imgView.frame = CGRectMake(vcViewWidth * i, 0, vcViewWidth, vcViewHeight); [_scrollView addSubview:imgView]; } 复制代码
_scrollView.scrollEnabled = YES; 复制代码
_scrollView.bounces = YES; 复制代码
//开启横向弹动效果 _scrollView.alwaysBounceHorizontal = YES; //关闭纵向弹动效果 _scrollView.alwaysBounceVertical = NO; 复制代码
_scrollView.pagingEnabled = YES; 复制代码
//隐藏横向滚动条 _scrollView.showsHorizontalScrollIndicator = NO; //隐藏竖向滚动条 _scrollView.showsVerticalScrollIndicator = NO; 复制代码
UIScrollView的代理,就是设置UIScrollView上的事件回调的协议,一般我们让当前控制器来实现协议。
文件:ViewController.h @interface ViewController : UIViewController<UIScrollViewDelegate> @end 复制代码
文件:ViewController.m #import "ViewController.h" @interface ViewController () /** * 滚动视图 */ @property(retain,nonatomic) UIScrollView* scrollView; @end - (void)viewDidLoad { [super viewDidLoad]; //...省略上面提到的设置 //将ScrollView添加到控制器的View上 [self.view addSubview:_scrollView]; //设置代理 _scrollView.delegate = self; } //滚动视图移动时回调 - (void) scrollViewDidScroll:(UIScrollView *)scrollView { NSLog(@"视图移动 x: %f", scrollView.contentOffset.x); } //滚动视图结束拖动时回调 - (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { NSLog(@"视图结束拖动"); } //滚动视图即将开始拖动时回调 - (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView { NSLog(@"滚动视图即将开始拖动"); } //滚动视图结束拖动时回调 - (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { NSLog(@"滚动视图结束拖动"); } //视图即将减速时调用 - (void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView { NSLog(@"视图即将减速"); } //视图已经结束减速时回调 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { NSLog(@"视图已经结束减速"); } @implementation ViewController 复制代码
self.scrollView.contentOffset = CGPointMake(0, 0); //或者 [self.scrollView scrollRectToVisible:CGRectMake(0, 0, 300, 400) animated:NO]; 复制代码
[self.scrollView scrollRectToVisible:CGRectMake(0, 0, 300, 400) animated:YES]; 复制代码