- 父类是UIView
- UIScrollView是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以滚动查看所有的内容
UIScrollView的基本使用
1. 将需要展示的内容添加到UIScrollView中
2. 设置UIScrollView的contentSize属性,告诉UIScrollVie滚动的范围
3. 显示细节:
1. 超出UIScrollView边框的内容会被自动隐藏
2. 用户可以用过手势拖动来查看超出边框并被隐藏的内容
UIScrollView无法滚动情况
- 没有设置
contentSize
scrollEnabled = NO
- 没有接收到触摸事件:
userInteractionEnabled = NO
- 这时控件内所有子控件都不可与用户交互
UIScrollView常见属性
--
// 表示UIScrollView滚动的位置
// 是内容层左上角与scrollView左上角的间距值)
scrollView.contentOffset = CGPointMake(10, 10);
// 滚动范围
scrollView.contentSize = CGSizeMake(300, 300);
// 设置内边距
// 用来避免scrollView的内容被其他控件挡住
scrollView.contentInset = UIEdgeInsetsMake(10, 10,10, 10);
// 是否能滚动
self.scrollView.scrollEnabled = YES;
// 设置弹簧效果
// 设置UIScrollView是否需要弹簧效果(默认YES)
scrollView.bounces = YES;
// 若bounces设置为NO,则下面两项无论怎么设置都不会滚动
// 设置水平方向是否需要弹簧效果(默认YES)
scrollView.alwaysBounceHorizontal = YES;
// 设置垂直方向是否需要弹簧效果(默认NO)
scrollView.alwaysBounceVertical = YES;
// 设置缩放比例
scrollView.maximumZoomScale = 2.0;//最大放大比例
scrollView.minimumZoomScale = 0.2;//最小缩小比例
self.scrollView.zoomScale = 3;
//手动设置图片当前伸缩比例
// 设置指示器
// 指示器风格
scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
// 指示器边距
scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(20, 20, 20, 20);
// 是否展示水平的指示器
scrollView.showsHorizontalScrollIndicator = NO;
// 是否展示垂直的指示器
scrollView.showsVerticalScrollIndicator = NO;
// 是否分页
scrollView.pagingEnabled = YES;
监听UIScrollView的滚动
- 设置代理
self.scrollView.delegate = self;
- 让控制器遵守协议
@interface FZQpageView()<UIScrollViewDelegate>
- 实现协议中的方法
// 用户开始拖拽时调用 -(void)scrollViewWillBeginDragging:(UIScrollview *)scrollView; //滚动到某个位置时调用 -(void)scrollViewDidScroll:(UIScrollView *)scrollView; // 用户结束拖拽时调用 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate; //屏幕停止滚动时调用 -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
监听UIScrollView的缩放
MAC中按住option缩放
-
缩放实现步骤:
- 设置UIScrollView的id<UISCrollViewDelegate> delegate代理对象
self.scrollView.delegate = self;
- 设置缩放比例
// 设置缩放比例 scrollView.maximumZoomScale = 2.0;//最大放大比例 scrollView.minimumZoomScale = 0.2;//最小缩小比例
- 让代理对象实现下面的方法,返回需要缩放的视图控件
// 返回需要缩放的视图控件 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { // 返回scrollView的子控件 return self.imageView; }
- 跟缩放相关的其他代理方法
// 缩放即将开始的时候调用 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view; // 正在缩放的时候调用 - (void)scrollViewDidZoom:(UIScrollView *)scrollView;
UIScrollView在storyboard中的自动布局(不推荐)
- 详见UIStoryboard中
在storyboard\xib中给UIScrollView子控件添加约束
UIScrollView滚动原理->修改bonuds
- 矩形框和内容的理解
1. 矩形框
1. 控件自己的显示位置和尺寸
2. 内容
2. 每个控件内部都有一个内容层,无限大
frame和bounds的重新认识
1. frame
1. 以父控件的左上角为坐标原点, 计算出的控件自身的位置和尺寸
2. bounds
1. 以内容的左上角为坐标原点, 计算出的控件自身矩形框的位置和尺寸
3. 概括
1. frame.size == bounds.size
2. scrollView.bounds.origin == scrollView.contentOffset-
bounds和frame的区别
-
UIScrollView的底层实现模仿
/* 目标:模仿UIScrollView,修改bounds 1. 添加拖动手势 2. 获取手指偏离量,改变bounds */ - (void)viewDidLoad { [super viewDidLoad]; UIView *scrollView = [[UIView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:scrollView]; // 添加子控件 UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; redView.backgroundColor = [UIColor redColor]; [scrollView addSubview:redView]; ## 下面的代码相当于设置contentsize // 添加拖动手势 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; [scrollView addGestureRecognizer:pan]; } // 手指拖动就会调用 - (void)pan:(UIPanGestureRecognizer *)pan { // 获取偏移量 CGFloat transY = [pan translationInView:pan.view].y; CGFloat y = pan.view.bounds.origin.y - transY; // 修改bounds pan.view.bounds = CGRectMake(0, y, self.view.bounds.size.width, self.view.bounds.size.height); // 复位 [pan setTranslation:CGPointZero inView:pan.view]; }