⼀、UIScrollView的创建和常⽤属性
- UIScrollView是UIView的⼦类,所以我们可以仿照UIView的 创建步骤创建⼀个ScrollView。
- UIScrollView作为所有滚动视图的基类,所以学好 UIScrollView也成为学好UITableView和UICollectionView等 滚动视图的前提。
- UIScrollView主要使⽤在滚动头条(轮播图), 相册等常见的 功能⾥。
⼆、UIScrollView的协议⽅法
- 当我们签好协议,设置好代理⼈之后,我们就可以使⽤ UIScrollView的协议⽅法了,它的协议⽅法分为两部分:
- ⼀是监控滚动时候的状态。
- ⼆是控制视图的缩放。
#pragma mark -----代理检测滚动过程时触发的方法-----
//1、滚动过程中触发的方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"正在滚动");
}
//2、即将开始拖拽的方法,此时滚动视图即将加速
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
NSLog(@"即将进行拖拽");
}
//3、结束拖拽的方法,不再加速
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
NSLog(@"拖拽结束");
}
//4、即将开始减速
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
NSLog(@"即将开始减速");
}
//5、结束减速,也就是停止滚动
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
NSLog(@"结束滚动");
//先从负责滚动的大scrollView找到他的⼦视图
for (UIScrollView *sView in scrollView.subviews) {
// 再根据子类的对象类型进行判断
if ([sView isKindOfClass:[UIScrollView class]]) {
// 把视图的尺寸恢复到原有尺寸
sView.zoomScale = 1.0;
}
}
}
//指定缩放视图
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return [scrollView.subviews firstObject];//因为scrollView内自带两个滑动视图,也是子视图,所以只能用firstObject或者objiectAtIndex:0
}
//缩放结束
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
NSLog(@"%@",NSStringFromCGSize(scrollView.contentSize));
}
//正在缩放
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
//实现中心缩小
UIImageView *imageView = [scrollView.subviews firstObject];
if (scrollView.zoomScale <= 1.0) {
imageView.center = CGPointMake(kWidth / 2, kHeight / 2);
}
//1、滚动过程中触发的方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"正在滚动");
}
//2、即将开始拖拽的方法,此时滚动视图即将加速
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
NSLog(@"即将进行拖拽");
}
//3、结束拖拽的方法,不再加速
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
NSLog(@"拖拽结束");
}
//4、即将开始减速
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
NSLog(@"即将开始减速");
}
//5、结束减速,也就是停止滚动
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
NSLog(@"结束滚动");
//先从负责滚动的大scrollView找到他的⼦视图
for (UIScrollView *sView in scrollView.subviews) {
// 再根据子类的对象类型进行判断
if ([sView isKindOfClass:[UIScrollView class]]) {
// 把视图的尺寸恢复到原有尺寸
sView.zoomScale = 1.0;
}
}
}
//指定缩放视图
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return [scrollView.subviews firstObject];//因为scrollView内自带两个滑动视图,也是子视图,所以只能用firstObject或者objiectAtIndex:0
}
//缩放结束
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
NSLog(@"%@",NSStringFromCGSize(scrollView.contentSize));
}
//正在缩放
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
//实现中心缩小
UIImageView *imageView = [scrollView.subviews firstObject];
if (scrollView.zoomScale <= 1.0) {
imageView.center = CGPointMake(kWidth / 2, kHeight / 2);
}
}
- (void)tap:(UITapGestureRecognizer *)tap {
UIImageView *image = (UIImageView *)tap.view;
NSLog(@"%ld",image.tag);
FirstViewController *firstVC = [[FirstViewController alloc] init];
[self.navigationController pushViewController:firstVC animated:YES];
[firstVC release];
UIImageView *image = (UIImageView *)tap.view;
NSLog(@"%ld",image.tag);
FirstViewController *firstVC = [[FirstViewController alloc] init];
[self.navigationController pushViewController:firstVC animated:YES];
[firstVC release];
}
- (void)viewDidLoad {
[super viewDidLoad];
//创建滚动视图
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, kWidth, kHeight)];
//设置滚动视图的相关属性
//1、滚动区域,内容区域的大小
//如果想要实现滚动操作,有三种情况:
//1、内容视图(滚动区域)的宽大于滚动视图的宽
//2、内容视图(滚动区域)的高大于滚动视图的高
//3、内容视图(滚动区域)的宽和高都大于滚动视图的宽和高
[super viewDidLoad];
//创建滚动视图
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, kWidth, kHeight)];
//设置滚动视图的相关属性
//1、滚动区域,内容区域的大小
//如果想要实现滚动操作,有三种情况:
//1、内容视图(滚动区域)的宽大于滚动视图的宽
//2、内容视图(滚动区域)的高大于滚动视图的高
//3、内容视图(滚动区域)的宽和高都大于滚动视图的宽和高
//UIScrollView⽤来控制滚动范围的重要属性contentSize,通过这个重要属性设置才可以控制视图的滚动,我们⽬标铺设9个屏幕宽度的图⽚,所以我们设置滚动范围是9个屏幕宽度contentSize有两个参数,⼀个是width,另⼀个是height,分别设置两个值有不同的效果
scrollView.contentSize = CGSizeMake(kWidth * 9, kHeight);//横屏滚动
//设置滚动视图的代理
scrollView1.delegate = self;
//滚动视图的偏移量
scrollView.contentOffset = CGPointMake(0, 0);
//整页滚动
scrollView.pagingEnabled = YES;
scrollView.contentOffset = CGPointMake(0, 0);
//整页滚动
scrollView.pagingEnabled = YES;
//关闭横向滚动条
scrollView.showsHorizontalScrollIndicator = NO;
//关闭纵向滚动条
scrollView.showsHorizontalScrollIndicator = NO;
//关闭纵向滚动条
// scrollView.showsVerticalScrollIndicator = NO;
//关闭滚动视图的回弹效果(默认是开启的)
scrollView.bounces = NO;
//展示图片 for循环创建9个UIImageView并且添加到滚动视图上面
for (int i = 0; i < 9; i ++) {
UIImageView *imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kWidth, kHeight)];
imageView1.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i + 1]];
UIImageView *imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kWidth, kHeight)];
imageView1.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i + 1]];
imageView1.tag = 100 + i;
//创建小scrollView
UIScrollView * scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, kHeight * i, kWidth, kHeight)];
//指定代理
UIScrollView * scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, kHeight * i, kWidth, kHeight)];
//指定代理
scroll.delegate = self;
/*
//如果想实现视图的缩放功能,必须指定缩放的视图以及缩放的比例
//指定缩放视图需要实现代理方法,指定缩放比例,是为滚动设置缩放比例
//如果想实现视图的缩放功能,必须指定缩放的视图以及缩放的比例
//指定缩放视图需要实现代理方法,指定缩放比例,是为滚动设置缩放比例
*/
//指定缩放比例
scroll.minimumZoomScale = 0.5;
scroll.minimumZoomScale = 0.5;
scroll.maximumZoomScale = 2.0;
// 设置当前的⽐例
// scroll.zoomScale = 1;
[scroll addSubview:imageView1];
imageView1.userInteractionEnabled = YES;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
//拍一次
tap.numberOfTapsRequired = 1;
//拍一次
tap.numberOfTapsRequired = 1;
//一根手指
tap.numberOfTouchesRequired = 1;
[imageView1 addGestureRecognizer:tap];
[scrollView addSubview:scroll];
[scroll release];
[imageView1 release];
}
[self.view addSubview:scrollView];
[scrollView release];
// Do any additional setup after loading the view.
}
三、UIScrollView和UIPageControl的结合使⽤
我们可以通过UIPageControl的点击事件和UIScrollView的 偏移量实现⼆者的关联使⽤
⾸先给UIPageControl设定点击事件。
[page addTarget:self action:@selector(pageControlAction:)forControlEvents:UIControlEventValueChanged];
// 在pageControl的点击⽅法⾥对ScrollView进⾏关联,通过操作
scrollView的偏移量ContentOffset进⾏视图上得切换
- (void)pageControlAction:(UIPageControl *)page
{
// 通过tag值先找到要操作的scrollView对象
UIScrollView *scroll = (UIScrollView *)[self.view viewWithTag:1000];
// 根据pageControl当前的⻚数乘以屏幕宽度计算当前的偏移量,⽤带动画的⽅法能让切换过程中更加柔和
[scroll setContentOffset:CGPointMake(page.currentPage * WIDTH, 0) animated:YES];
scrollView的偏移量ContentOffset进⾏视图上得切换
- (void)pageControlAction:(UIPageControl *)page
{
// 通过tag值先找到要操作的scrollView对象
UIScrollView *scroll = (UIScrollView *)[self.view viewWithTag:1000];
// 根据pageControl当前的⻚数乘以屏幕宽度计算当前的偏移量,⽤带动画的⽅法能让切换过程中更加柔和
[scroll setContentOffset:CGPointMake(page.currentPage * WIDTH, 0) animated:YES];
}
我们完成了pageControl对scrollView的控制操作,接下来实现scrollView对 pageControl的操作
//先找到scrollView的滚动结束触发的协议⽅法
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
NSLog(@"当停⽌的时候触发");
// 先通过tag值找到要操作的视图
UIPageControl *page = (UIPageControl *)[self.view viewWithTag:2000];
// 根据当前scrollView的偏移量计算出来当前是第⼏张图⽚,让pageControl显⽰对应的⻚数
page.currentPage = scrollView.contentOffset.x / WIDTH;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
NSLog(@"当停⽌的时候触发");
// 先通过tag值找到要操作的视图
UIPageControl *page = (UIPageControl *)[self.view viewWithTag:2000];
// 根据当前scrollView的偏移量计算出来当前是第⼏张图⽚,让pageControl显⽰对应的⻚数
page.currentPage = scrollView.contentOffset.x / WIDTH;
}