UIScrollView
UIScrollView继承自UIView,包含有三个子类:UITableView,UITextView,UICollectionView。UIScrollView是一种容器视图,当内容超出屏幕时,可以提供水平或者垂直滚动条。
下面通过一个例子来对UIScrollView进行一个初步的了解
//创建两个viewController(A和B),在A中实现垂直方向的滚动浏览一组图片,点击图片去到B,然后打开所点击的图片,并且可以水平滚动查看图片
- (void)viewDidLoad {
[super viewDidLoad];
//在A中
/*
scrollView出现坐标异常的情况
1.视图控制器在导航控制器中
2.视图控制器的根视图的第一子视图是scrollView
*/
//首先通过IB将A压入到navigationController中,在storyboard中选中A->选择Editor->Embin->Navigation Controller
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0?YES:NO) {
self.edgesForExtendedLayout = UIRectEdgeNone;//由于加入了导航控制器,scrollView的坐标会出现异常,加上此句可解决异常问题
}
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];//ScreenWidth,ScreenHeight为宏定义的屏幕宽高
[self.view addSubview:scrollView];
//添加图片到mImages数组中
NSMutableArray *mImages = [NSMutableArray array];
for (int i = 0; i < 10; i++) {
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"anglebaby%d",i+1]];
[mImages addObject:image];
}
//通过双层for循环来创建
//控制行数
int count = 0;
if (mImages.count % 3 == 0) {
count = (int)mImages.count/3;
}
else {
count = (int)mImages.count/3 + 1;
}
CGFloat height = (ScreenHeight-64)/2;
CGFloat width = ScreenWidth/3;
//用来计数,防止数循环超出数组范围
int num = 0;
for (int i = 0; i < count; i++) {
//控制图片为3列
for (int j = 0; j < 3; j++) {
//超过数组元素个数则跳出循环
if (num >= mImages.count) {
break;
}
//创建button
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(width * j, height *i , width, height);
//设置button图片
[button setImage:mImages[num] forState:UIControlStateNormal];
//添加点击事件
[button addTarget:self action:@selector(clickAction:) forControlEvents:UIControlEventTouchDown];
[scrollView addSubview:button];
num++;
button.tag = 101 + num;
}
}
//设置scrollView内容大小,该处只要在垂直方向上滚动,所以width为0
scrollView.contentSize = CGSizeMake(0, height * count + 64);
//隐藏滚动条
scrollView.showsVerticalScrollIndicator = NO;
//把self作为scrollView的代理
scrollView.delegate = self;
}
//点击事件方法
- (void)clickAction:(UIButton *)sender {
self.bvc = [[BViewController alloc] init];
//push到B
[self.navigationController pushViewController:self.bvc animated:YES];
NSLog(@"%lu",sender.tag);
//传值
self.bvc.tag = sender.tag;
}
//指示当用户点击状态栏候,滚动视图是否能够滚动到顶部,需要设置scrollView.scrollToTop = YES;//默认YES
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
return YES;
}
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {
NSLog(@"%s",__func__);
}
//在B中
- (void)viewDidLoad {
[super viewDidLoad];
// NSLog(@"1");
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0? YES:NO) {//三目运算符
// self.automaticallyAdjustsScrollViewInsets = NO;//自动调整scrollView坐标异常
self.edgesForExtendedLayout = UIRectEdgeNone;
}
//滚动视图
_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight-64)];
// scrollView.backgroundColor = [UIColor yellowColor];
_scrollView.delegate = self;
[self.view addSubview:_scrollView];
_mImages = [NSMutableArray array];
for (int i = 0; i < 10; i++) {
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"anglebaby%d",i+1]];
[_mImages addObject:image];
}
[self.mImages insertObject:[UIImage imageNamed:@"anglebaby10"] atIndex:0];
[self.mImages insertObject:[UIImage imageNamed:@"anglebaby1"] atIndex:11];
//控制滚动范围的属性
_scrollView.contentSize = CGSizeMake(ScreenWidth*_mImages.count, 0);
_scrollView.tag = 1000;
[_scrollView setContentOffset:CGPointMake(ScreenWidth*(self.tag-102+1), 0) animated:YES];
for (int i = 0; i < _mImages.count; i++) {
_smallScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(ScreenWidth*i, 0, ScreenWidth, ScreenHeight-64)];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.smallScrollView.bounds];
imageView.image = _mImages[i];
// imageView.contentMode = UIViewContentModeScaleAspectFit;
[_smallScrollView addSubview:imageView];
[_scrollView addSubview:_smallScrollView];
//控制最大缩放比例
_smallScrollView.maximumZoomScale = 2.0;
//控制最小缩放比例
_smallScrollView.minimumZoomScale = 1.0;
_smallScrollView.delegate = self;
//关闭边界回弹效果
_smallScrollView.bounces = NO;
}
//按页滚动
_scrollView.pagingEnabled = YES;
//水平方向滚动条
_scrollView.showsHorizontalScrollIndicator = NO;
self.view.backgroundColor = [UIColor whiteColor];
//初始化pageControl
_pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake((ScreenWidth-200)/2, ScreenHeight-100, 200, 30)];
_pageControl.numberOfPages = self.mImages.count;
_pageControl.currentPage = self.tag-102;
[_pageControl addTarget:self action:@selector(pageControlAction:) forControlEvents:UIControlEventValueChanged];
_pageControl.backgroundColor = [UIColor blackColor];
[self.view addSubview:_pageControl];
}
//UIScrollViewDelegate协议
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
UIImageView *imgView = [scrollView.subviews objectAtIndex:0];
return imgView;
}
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {
NSLog(@"%s",__func__);
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
NSLog(@"%s",__func__);
}
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
NSLog(@"%s",__func__);
}
//只要是拖拽scrollView就会触发这个方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"%s",__func__);
if (scrollView.contentOffset.x < ScreenWidth-30) {
[scrollView setContentOffset:CGPointMake(ScreenWidth * 10, 0) animated:NO];
}
else if (scrollView.contentOffset.x > ScreenWidth*11+30) {
[scrollView setContentOffset:CGPointMake(ScreenWidth, 0) animated:NO];
}
}
//开始拖拽的时候会触发这个方法
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
NSLog(@"%s",__func__);
}
//将要结束拖拽的时候会触发这个方法
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
NSLog(@"%s",__func__);
}
//当结束多拽的时候会触发这个方法
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
NSLog(@"结束拖拽");
}
//当滚动减速的时候会触发这个方法
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
NSLog(@"减速滚动");
}
//当滚动彻底停止的时候会触发这个方法
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
UIScrollView *bigScrollView = (UIScrollView *)[self.view viewWithTag:1000];
int page = bigScrollView.contentOffset.x/ScreenWidth;
_pageControl.currentPage = page;
NSLog(@"滚动停止");
}
//当滚动视图动画完成后,调用该方法,如果没有动画,那么该方法不被调用
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
NSLog(@"%s",__func__);
}
//指示当用户点击状态栏候,滚动视图是否能够滚动到顶部,需要设置scrollView.scrollToTop = YES;
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
return YES;
}
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {
NSLog(@"%s",__func__);
}
- (void)pageControlAction:(UIPageControl *)sender {
NSLog(@"%ld",sender.currentPage);
}