UIScrollView是一个能够滚动的视图控件,可以滑动来展示大量的内容,并且可以让用户通过滚动拖拽手势查看所有的内容;也可以通过捏合手势来放大或缩小观看的内容。
> UIScrollView的使用步骤:
- 将需要展示的内容添加到UIScrollView中。
- 设置UIScrollView的contentSize属性,告诉UIScrollView所有内容的尺寸,也就是告诉 它滚动的范围。
- 其中很重要的一点是在添加控件或图片到UIScrollView中时不能固定其(x,y)值否则不能移动或相对位置。(固定的意思不是初始的位置值不设定,而是让其位置(x,y)值可以改变,以便UIScrollView可以实现滑动)
> UIScrollView的属性:
1)常用属性:
@property(nonatomic)CGPoint contentOffset; 此属性用来表示UIScrollView滚动到的位置。又叫内容偏移量:内容左上角减去scoreView左上角差的值。就是添加到UIScrollView视图中显示的图像或控件的x,y坐标,初始值为(0,0),设置之后初始显示的坐标就改变了。
@property(nonatomic)CGSize contentSize;这个属性?用来表示UIScrollView内容的尺?大小,滚动范围大小。就是要看到的整个视图范围包括显示的和未显示的。
@property(nonatomic)UIEdgeInsets contentInset; 这个属性能够在UIScrollView的四周增加额外的滚动区域即周围的厚度。在那个控件的周围加上一层厚度。
2)其他属性:
@property(nonatomic) BOOL bounces; d 设置UIScrollView是否需要弹簧效果。默认为YES;
@property(nonatomic,getter=isScrollEnabled)BOOL scrollEnabled; 设置UIScrollView是否能滚动
@property(nonatomic) BOOL showsHorizontalScrollIndicator; 是否显?示水平滚动条 。默认不显示。
@property(nonatomic) BOOL showsVerticalScrollIndicator; 是否显示垂直滚动条 默认不显示。
> UIScrollView代理的使用:
scrollViewDidScroll:只要scrollView在滚动,就会调用这个方法(监听scrollView的滚动),已经开始滚动
-(void)scrollViewDidScroll:(UIScrollView*)scrollView
scrollViewWillBeginDragging:用户即将开始拖拽scrollView,手指碰到屏幕,并且移动,执行一次
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
用户即将停止拖拽scrollView,就会调用这个方法
-(void)scrollViewWillEndDragging:(UIScrollView )scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint )targetContentOffset
scrollViewWillBeginDecelerating:scrollView已经开始减速,手指离开屏幕,正在滚动的视图减速,执行一次
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
scrollViewDidEndDecelerating:视图静止,执行一次
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
用户已经停止拖拽scrollView,就会调用这个方法
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
> UIScrollView其它功能的使用
>>1.缩放功能:
scrollView.minimumZoomScale = 0.05;//设置可缩小的最小比例
scrollView.maximumZoomScale = 5.0;//设置可放大的最大比例
/*与缩放有关的代理方法*/
viewForZoomingInScrollView:指定scrollView的某一个子视图为可缩放视图,前提条件是该视图已经添加到scrollView上面
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
UIView *view = [scrollView viewWithTag:1000];
return view;
}
scrollViewWillBeginZooming:withView:开始缩放 第二个参数是指我们将要缩放的视图(也就是是指定的view),执行一次
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
NSLog(@"%@",view);
}
scrollViewDidZoom:正在缩放的代理方法 只要正在缩放,就会执行此方法,所以此方法在缩放过程中会多次调用
-(void)scrollViewDidZoom:(UIScrollView *)scrollView
{
NSLog(@"%s",__func__);
}
scrollViewDidEndZooming:withView:atScale:缩放结束执行的代理方法, view当前正在缩放的视图,scale当前正在缩放视图的缩放比例,执行一次
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
{
NSLog(@"%s",__func__);
}
>> 2.设置是否分页:scrollView.pagingEnabled=YES;
>> 如果UIScrollView无法滚动,可能是以下原因:
1. 没有设置contentSize/contentSize不能设置小于全部看到的视图范围值,设置的值是要全部看到的范围。
2. *很重要的一点是在加入到UIScrollView的控件或者图片不能在UIScrollView中设置固定位置即(x,y) 或相对布局固定,左右的对齐方式在使用轮播图时是可以使用的。scrollEnabled = NO
3. 没有接收到触摸事件:userInteractionEnabled = NO
4. 没有取消autolayout功能(在Sotryboard中添加了scrollView控件,要想scrollView滚动,必须取消autolayout)
查询: UIScrollView 控件不能滑动原因
**** 使用 UIScrollView + Masonry 布局 ****
在进行 UIScrollView subview 布局时,需要进行位置postion和size设置,需要注意以下原因:
1.纵向滑动不使用 left-right 计算确定宽度;横向滑动不使用 top-bottom 计算确定高度。
2. 使用 Masonry 需使用 width/height 自行设置确定高度和宽度,并且 left/right top/bottom不能成对出现。
>> 经验证,导致不能滑动
1. scrollView.contentSize/contentOffset 前后设置的对于 UIScrollView 对象本身无任何影响,这二者也只是UIScrollView的两个属性, 除非有特殊情况出现。
1. 未设置 scollView.scrollEnabled = YES;
2. 未设置 scrollView.contentSize = CGSizeMake(kScreenWidth,kScreenHight*2); // 并且设置内容尺寸要大于设置的UIScrollView的frame。
3. 在 UIScrollView 对象视图上添加新的控件或者 UIView 对象后不能使用 Masonry 固定其位置,否则会导致不能滑动。
4. 即 使用 UIScrollView + Masonry 布局不能同时使用,使用另外方法完成 Masonry布局
>> 经验证,不能滑动和以下原因无关
1. scollView.userInteractionEnabled = YES;
2. scollView.multipleTouchEnabled = YES;
3. scrollView(UIScrollView控件对象),使用Masonry布局无影响。即使固定scrollView frame
[self.bottomSV mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.mas_top).offset(kScreenHeight/2-100);
make.left.right.equalTo(self);
make.bottom.equalTo(self.mas_bottom).offset(0);
}];
>>> 如果在最后还是没有找到不能滑动原因或者急需滑动解决,可以暂且使用UITableView或者UICollectioView解决需要滑动的问题,也不失为一种方法。