一、UIScrollView简介
UIScrollView主要用于对其中的子控件(UIImageView/UIView等)进行缩放,给UIScrollView控件中的子控件添加子控件并设置约束的时候,除了给子控件设置x、y、width、height约束外,还应设置子控件距离scrollView顶部底部的约束(目的是为了告诉scrollView其contentSize是多少),这样才能保证约束不报错
二、scrollView的重要属性
- contentSize:用来控制scrollView中能够滚动的范围,属性类型:CGSize
contentOffSet:用来标定scrollView中内容的左上角相对于scrollView左上角的位置,属性类型:CGPoint
x为正向增大代表内容是向scrollView的左边滚动
y为正向增大代表内容是向scrollView的上方滚动
作用是用来确定在加载程序时,内容相对于scrollView的初始位置
另外,通过改变scrollView的contentOffset属性,可以改变scrollView显示的内容contentInset:相当于scrollVIew内容的额外增加的边距,值为正的时候代表边距向外扩展,不影响内容的实际大小,只是增加了一圈的滚动范围 CGRect 类型。按钮的inset是向内缩
contentOffset的内容左上角不包括此增加的边距
对于contentInset可以用此方法进行设值
self.scrollView.contentInset = UIEdgeInsetsMake(20, 50, 80, 100);
- scrollView的其他属性
@property(nonatomic) BOOL bounces;
设置UIScrollView是否需要弹簧效果
@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;
设置UIScrollView是否能滚动
@property(nonatomic) BOOL showsHorizontalScrollIndicator;
是否显示水平滚动条
@property(nonatomic) BOOL showsVerticalScrollIndicator;
是否显示垂直滚动条
@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets
UIViewController的属性,但是与scrollView相关,设置scrollView是否自动调整contentInsets
- 将controllerView设置为scrollView的代理,可以实现监听scrollview内容滚动和缩放的事件,即在内容发生滚动和缩放时controllerView会自动调用相关的方法。其中要想实现内容的缩放必须设置controllerView为代理
三、要想让controllerView成为scrollView的代理,必须有以下三个步骤:
- controllerView遵守scrollView的协议;
- 在viewDidLoad函数中设置scrollView的代理为self,即代理为controllerView
- 实现协议中的方法
四、scrollView内容滚动
要想让scrollView中的内容能够滚动,必须设置contentSize,且contentSize的值必须大于scrollView的frame,某个方向不想让其滚动,那就设置为0;
对于滚动时,可实现的方法为
- (void)scrollViewWillBeginDragging:(UIScrollView*)scrollView;
用户开始拖拽时自动调用的方法,一次拖拽只会调用一次
(void)scrollViewDidScroll:(UIScrollView *)scrollView;
内容正在滚动时调用的方法(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
(decelerate表示用户停止拖拽时内容是否降速了,如果有降速,decelerate为YES,如果没有降速,decelerate为NO);
用户停止拖拽时调用的方法,用户停止拖拽了,可能内容由于惯性还会继续移动,所以还会继续调用(scrollViewDidScroll:)方法
UIScrollView无法滚动可能的原因及解决办法
- 没有设置contentSize
- scrollEnabled = NO
- 没有接收到触摸事件:userInteractionEnabled = NO
- 没有取消autolayout功能(要想scrollView滚动,在XCode5.x以下必须取消Autolayout,在XCode6以上不需要)
UIScrollView的frame.size与contentSize的区别:
- frame.size指的是: UIScrollView的可视区域的大小, UIScrollView本身的大小
- contentSize指的是: UIScrollView中所包含的内容的大小(要滚动的实际内容的大小)
如果contentSize <= frame.size ,则scrollView无法滚动
scrollView内容缩放
- 首先必须设置scrollView的缩放比例,最大值和最小值
self.scrollView.maximumZoomScale
self.scrollView.minimumZoomScale
实现scrollView中的相关方法,以实现controllerView对scrollView中内容缩放的监听,代理设置过程与scrollView内容滚动时相同。
对于缩放过程,调用的相关方法为:
(UIView )viewForZoomingInScrollView:(UIScrollView )scrollView
以上方法非常重要,目的是为了告诉scrollView要对哪个控件进行缩放,返回值就是返回要缩放的控件,而且必须使用代理,同一时间只能对一个控件进行缩放
此方法会动态的改变scrollView的contentSize,因此无需再改变contentSize都可以实现内容的滚动
(void)scrollViewWillBeginZooming:(UIScrollView )scrollView withView:(UIView )view
内容将要开始缩放时调用的方法,scrollView与属性中的scrollView是同一个
view就是被缩放的控件(void)scrollViewDidZoom:(UIScrollView *)scrollView
内容正在进行缩放时调用的方法(void)scrollViewDidEndZooming:(UIScrollView )scrollView withView:(UIView )view atScale:(CGFloat)scale
内容停止缩放时调用的方法
scrollView的分页效果参照的是scrollView自身的width或者height,与所设置的内容大小没有关系