UIScrollView:一个能够滚动的视图控件,可以用来显示大量的内容,并且可以通过滚动查看所有的内容
有两个常用的子类:UITableView,UICollectionView
简单使用:
1.将需要展示的内容添加到UIScrollView中
2.设置UIScrollView的contentSize属性,告诉UIScrollView的所有内容的尺寸,也就是告诉它滚动的范围
注意
UIScrollView尽量使用代码创建,不用Main.storyboard,Xib创建,contentSize不好设置
1.属性
- 背景颜色
@property(nonatomic,copy) UIColor *backgroundColor
- 监控目前滚动的位置(默认CGPointZero)
@property(nonatomic) CGPoint contentOffset;
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;
- UIScrollView内容的尺寸,滚动范围
@property(nonatomic) CGSize contentSize;
- 在UIScrollView的四周添加额外的属性
@property(nonatomic) UIEdgeInsets contentInset;
- 用于监听滚动事件的代理
@property(nonatomic,weak) id<UIScrollViewDelegate> delegate;
- 控制控件遇到边框是否反弹(默认为YES)
@property(nonatomic) BOOL bounces;
- 控制垂直方向遇到边框是否反弹(默认为NO,如果为YES,bounces也是YES)
@property(nonatomic) BOOL alwaysBounceVertical;
- 控制水平方向遇到边框是否反弹(默认为NO,如果为YES,bounces也是YES)
@property(nonatomic) BOOL alwaysBounceHorizontal;
- 是否能滚动(默认YES)
@property(nonatomic) BOOL scrollEnabled;
- 是否显示水平滚动条(默认YES)
@property(nonatomic) BOOL showsHorizontalScrollIndicator;
- 控制控件是否整页翻动(默认为NO)
@property(nonatomic) BOOL showsVerticalScrollIndicator;
- 是否按页显示(默认NO)
@property(nonatomic) BOOL pagingEnabled
- 指定滚动条在scrollerView中的位置
@property(nonatomic) UIEdgeInsets scrollIndicatorInsets;
typedef struct UIEdgeInsets {
CGFloat top, left, bottom, right;
} UIEdgeInsets;
- 设定滚动条的样式
@property(nonatomic) UIScrollViewIndicatorStyle indicatorStyle;
typedef enum {
UIScrollViewIndicatorStyleDefault,
UIScrollViewIndicatorStyleBlack,
UIScrollViewIndicatorStyleWhite
} UIScrollViewIndicatorStyle;
- 最小的缩放比例和最大的缩放比例,以及设置放大比例
@property(nonatomic) CGFloat minimumZoomScale; // default is 1.0
@property(nonatomic) CGFloat maximumZoomScale; // default is 1.0.
@property(nonatomic) CGFloat zoomScale; // default is 1.0
- (void)setZoomScale:(CGFloat)scale animated:(BOOL)animated;
- 代理方法
//scrollView滚动时,就调用该方法。任何offset值改变都调用该方法。即滚动过程中,调用多次
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"scrollViewDidScroll");
CGPoint point=scrollView.contentOffset;
NSLog(@"%f,%f",point.x,point.y);
// 从中可以读取contentOffset属性以确定其滚动到的位置
// 注意:当ContentSize属性小于Frame时,将不会出发滚动
}
//当scrollView缩放时,调用该方法。在缩放过程中,回多次调用
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
NSLog(@"scrollViewDidScroll");
float value=scrollView.zoomScale;
NSLog(@"%f",value);
}
// 当开始滚动视图时,执行该方法。一次有效滑动(开始滑动,滑动一小段距离,只要手指不松开,只算一次滑动),只执行一次
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
NSLog(@"scrollViewWillBeginDragging");
}
//滑动视图,当手指离开屏幕那一霎那,调用该方法。一次有效滑动,只执行一次
// decelerate,指代,当我们手指离开那一瞬后,视图是否还将继续向前滚动(一段距离),经过测试,decelerate=YES
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
NSLog(@"scrollViewDidEndDragging");
if (decelerate) {
NSLog(@"decelerate");
}else{
NSLog(@"no decelerate");
}
CGPoint point=scrollView.contentOffset;
NSLog(@"%f,%f",point.x,point.y);
}
//滑动减速时调用该方法
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
NSLog(@"scrollViewWillBeginDecelerating");
// 该方法在scrollViewDidEndDragging方法之后。
}
// 滚动视图减速完成,滚动将停止时,调用该方法。一次有效滑动,只执行一次
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
NSLog(@"scrollViewDidEndDecelerating");
[_scrollView setContentOffset:CGPointMake(0, 500) animated:YES];
}
// 当滚动视图动画完成后,调用该方法,如果没有动画,那么该方法将不被调用
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;{
NSLog(@"scrollViewDidEndScrollingAnimation");
// 有效的动画方法为:
// - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated 方法
// - (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated 方法
}
// 返回将要缩放的UIView对象。要执行多次
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
NSLog(@"viewForZoomingInScrollView");
return self.imgView;
}
// 当将要开始缩放时,执行该方法。一次有效缩放,就只执行一次。
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view{
NSLog(@"scrollViewWillBeginZooming");
}
// 当缩放结束后,并且缩放大小回到minimumZoomScale与maximumZoomScale之间后(我们也许会超出缩放范围),调用该方法。
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{
NSLog(@"scrollViewDidEndZooming");
}
// 指示当用户点击状态栏后,滚动视图是否能够滚动到顶部。需要设置滚动视图的属性:_scrollView.scrollsToTop=YES;
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{
return YES;
}
// 当滚动视图滚动到最顶端后,执行该方法
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView{
NSLog(@"scrollViewDidScrollToTop");
}
方法执行顺序
2.代码例子
创建了一个存放三张图片,只显示一张图片,通过滚动可以显示其它图片的UIScrollView的实例化对象
#import "ViewController.h"
@interface ViewController ()<UIScrollViewDelegate>
@property (nonatomic , strong) UIScrollView *ScrollView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//UIScrollView
self.ScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 100, 300, 200)];
//设置delegate用于监听滚动的事件
_ScrollView.delegate = self;
//设置背景颜色
_ScrollView.backgroundColor = [UIColor blackColor];
//设置边界是否有回弹效果
_ScrollView.bounces = NO;
//设置是否按页显示
_ScrollView.pagingEnabled = YES;
//隐藏横向和纵向的滚动条
_ScrollView.showsHorizontalScrollIndicator = NO;
_ScrollView.showsVerticalScrollIndicator = NO;
//添加到默认视图上
[self.view addSubview:_ScrollView];
//显示所有的广告
for (int i = 0; i < 3; i++) {
//创建视图 用于显示图片内容
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(i*300, 0, 300,200)];
NSArray *imageName = @[[UIImage imageNamed:@"1"],[UIImage imageNamed:@"2"],[UIImage imageNamed:@"3"]];
imgView.image = [imageName objectAtIndex:i];
//添加到Scroll视图上
[_ScrollView addSubview:imgView];
}
//设置滚动视图的内容尺寸
_ScrollView.contentSize = CGSizeMake(300*3, 200);
}
@end
UIScrollView
比较contentSize, contentInset 和 contentOffset
@property(nonatomic) CGSize contentSize
struct CGSize { CGFloat width; CGFloat height; };
@property(nonatomic) CGPoint contentOffset
struct CGPoint { CGFloat x; CGFloat y; };
@property(nonatomic) UIEdgeInsets contentInset
typedef struct { CGFloat top, left , bottom, right ; } UIEdgeInsets;
3.contentSize,contentOffset,contentInset
contentSize
是scrollview中的一个属性,它代表scrollview中的可显示区域,假如有一个scrollview,它的frame为(0,0,320,480),而它的contentSize为(320,960).也就是说,这个scrollview整个内容的大小为(320,960),要通过上下滑动scrollview来查看(320,480)后的内容contentOffset
是scrollview当前显示区域顶点相对于frame顶点的偏移量,比如上个例子你拉到最下面,contentOffset就是(0 ,-480),也就是y偏移了480。contentOffset 的默认点为 CGPointZerocontentInset
理解起来比较困难, 它用4个数值表示contentView与scrollView的相对位置.具体看图吧
示意图
示意图