UIScrollView 使用细节
引言:
- 移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限
- 当展⽰示的内容较多,超出⼀一个屏幕时,⽤用户可通过滚动⼿手势来查看屏幕以外的内容
- 普通的 UIView 不具备滚动功能,不能显⽰示过多的内容
- UIScrollView 是一个能够滚动的视图控件,可以⽤用来展⽰示⼤大量的内容,并且可以通过滚 动查看所有的内容
# 一. 常用属性
- (void)createScrollView{
_scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
//1. 设置scrollview内容的尺寸
_scrollView.contentSize = imageView.bounds.size;
//2. 设置内容的偏移量,contentOffset参照contentSize的坐标系
_scrollView.contentOffset = CGPointMake(1000, 500);
//3. 设置是否回弹
_scrollView.bounces = YES;
//4. 设置内容的边距
_scrollView.contentInset = UIEdgeInsetsMake(10, 10, 10, 10);
//5. 设置是否可以滚动
_scrollView.scrollEnabled = YES;
//6. 是否可以滚动到内容的顶部(点击状态栏)
_scrollView.scrollsToTop = YES;
//7. 按页滚动
_scrollView.pagingEnabled =YES;
//8. 是否显示水平和垂直方向的指示器
_scrollView.showsHorizontalScrollIndicator = YES;
_scrollView.showsVerticalScrollIndicator = YES;
//9. 设置指示器的样式
_scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
//10. 设置代理
_scrollView.delegate = self;
CGFloat imageWidth = imageView.frame.size.width;
//11. 设置最小和最大缩放比例
_scrollView.minimumZoomScale = WIDTH / imageWidth;
_scrollView.maximumZoomScale = 1.5;
[self.view addSubview:_scrollView];
}
# 1. 几个坐标属性示意图:
- UIScrollView 的
frame
与contentsize
属性的区分:frame
指的是这个 scrollview 的可视范围(可看见的区域),contentsize
是其滚动范围。 contentinset
(不带*号的一般不是结构体就是枚举),为 UIScrollView 增加额外的滚动区域。(上,左,下,右)逆时针。contentsize
属性只能使用代码设置。contentoffset
是个CGpoint
类型的结构体,用来记录 ScrollView 的滚动位置,即记录着“框”跑到了哪里。知道了这个属性,就知道了其位置,可以通过设置这个属性来控制这个“框”的移动。- 不允许直接修改某个对象内部结构体属性的成员,三个步骤(先拿到值,修改之,再把修改后的值赋回去)。
# 二. 代理方法
UIScrollView 有自己的代理方法,在代理方法中有相当全面的调用时机,借用代理方法可以制作多种,ScrollView 的高级使用.
#pragma mark - UIScrollViewDelegate
// 只要发生滚动,就会调用该方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
// NSLog(@"scrollview滚动");
}
// 只要zoomScale发生变化,就会调用该方法
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
NSLog(@"发生缩放");
}
// 开始拖动
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
NSLog(@"开始拖动");
}
// 将要结束拖动
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
NSLog(@"将要结束拖动");
}
// 拖动结束
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
NSLog(@"拖动结束");
}
// 将要开始减速
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
NSLog(@"将要开始减速");
}
// 减速结束
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
NSLog(@"减速结束");//停止滚动
}
// 滚动动画结束
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
NSLog(@"滚动动画结束");
}
// 返回要缩放的子视图
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
//返回可以进行缩放的子视图
return scrollView.subviews[0];
}
// 将要开始缩放
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view {
NSLog(@"将要开始缩放");
}
// 缩放结束
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale{
NSLog(@"缩放结束");
}
// 是否可以滚动到顶部
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{
//scrollToTop = YES,才会调用该方法
//返回YES,可以滚动到顶部;NO 不可以
return YES;
}
// 滚动到顶部
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView{
NSLog(@"滚动到顶部");
}