UIScrollView
A view that allows the scrolling and zooming of its contained views.
UIScrollView是一个允许滚动和缩放其内容的视图。
概述
UIScrollView是UIKit类中多个类的父类,例如UITableView,UICollectView和UITextView。
UIScrollView对象的中心概念是,一个视图它的原点可在内容视图上调整。它将内容剪切到其frame上,frame通常(但不一定)与应用程序主窗口的内容一致。滚动视图可跟踪手指的运动并相应地调整原点,进而调整frame上的内容展示。滚动视图本身不显示任何图形,只显示垂直和水平滚动指示符。滚动视图必须知道内容视图的大小,以便知道何时停止滚动。默认情况下,当滚动超出内容范围时,它将“弹回”。
管理滚动视图中显示的内容绘图的对象应平铺内容的子视图,以使任何视图都不会超出屏幕的大小。当用户在滚动视图中滚动时,此对象应根据需要添加和删除子视图。
以上是官方文档的介绍,相信大家与我一样打开文档后看完介绍一脸懵逼什么都没学会。下面用通俗的话来讲一讲UIScrollView,以objective-c的api作为参考。
介绍
移动设备的屏幕⼤小是极其有限的,直接展现在用户界面的内容就受限,所以需要滑动和缩放等操作来扩展可视区域,而UIScrollView(滚动视图)是一个在日常开发中使用频率极高的容器视图控件, 它允许用户通过滚动和缩放的方式查看超出屏幕区域大小的内容, 在应用程序开发中经常使用到的UITableView(列表视图)、UICollectionView(集合视图)和UITextView(文本视图)都是它的子类。而UIScrollView本身并不显示任何图形效果,通过addSubView来展示subView。
属性
frame
这里指的是UIScrollView的frame属性,通常是整个屏幕的大小。也代表了UIScrollView的子视图最大展示位置
contensize
@property(nonatomic)CGSize contentSize; // default CGSizeZero
默认值为CGSizeZero,通过该属性设置UIScrollView的滚动区域,当contenSize属性大于frame.size时才能进行横竖方向上的滚动。
contentOffset
@property(nonatomic) CGPoint contentOffset;// default CGPointZero
该属性表示UIScrollView的内容视图在contentSize的偏移量,以contenSize区域的左上角与UIScrollView的左上角作计算。往往在实现代理方法中使用该属性来监控滚动的进度。
pagingEnabled
@property(nonatomic,getter=isPagingEnabled) BOOL pagingEnabled API_UNAVAILABLE(tvos);// default NO. if YES, stop on multiples of view bounds
是否分页属性,默认值为NO。YES则会在滚动时停止在多视图的边界。
代理方法
分页滚动图
这里实现了一个简单的横向图片滚动。通过在scrollview中添加imagview实现,代理方法只是实现了简单的NSLog信息的打印,并没有实现更高阶的逻辑或者动画效果,读者可以自行创作。
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 100, self.view.bounds.size.width, self.view.bounds.size.height - 200)];
scrollView.contentSize = CGSizeMake(self.view.bounds.size
.width * 4, self.view.bounds.size.height - 200);
scrollView.delegate = self;
scrollView.pagingEnabled = YES;
NSArray *imageNameArray = @[@"1", @"2", @"3", @"4"];
for (int i = 0; i < 4; ++i)
{
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(scrollView.frame.size.width * i, 0, scrollView.frame.size.width, scrollView.frame.size.height)];
imageView.image = [UIImage imageNamed: [imageNameArray objectAtIndex:i]];
imageView.contentMode = UIViewContentModeScaleAspectFit;
[scrollView addSubview:imageView];
}
[self.view addSubview:scrollView];
}
// any offset changes
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"scrollViewDidScroll - %@", @(scrollView.contentOffset.x));
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
NSLog(@"BeginDragging");
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
NSLog(@"EndDragging");
}
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
NSLog(@"开始加速");
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
NSLog(@"停止加速");
}