UIScrollView是一個能夠滾動的視圖控件,可以滑動來展示大量的內(nèi)容,并且可以讓用戶通過滾動拖拽手勢查看所有的內(nèi)容;也可以通過捏合手勢來放大或縮小觀看的內(nèi)容。
> UIScrollView的使用步驟:
- 將需要展示的內(nèi)容添加到UIScrollView中。
- 設(shè)置UIScrollView的contentSize屬性,告訴UIScrollView所有內(nèi)容的尺寸,也就是告訴 它滾動的范圍。
- 其中很重要的一點(diǎn)是在添加控件或圖片到UIScrollView中時不能固定其(x,y)值否則不能移動或相對位置。(固定的意思不是初始的位置值不設(shè)定,而是讓其位置(x,y)值可以改變,以便UIScrollView可以實(shí)現(xiàn)滑動)
> UIScrollView的屬性:
1)常用屬性:
@property(nonatomic)CGPoint contentOffset; 此屬性用來表示UIScrollView滾動到的位置。又叫內(nèi)容偏移量:內(nèi)容左上角減去scoreView左上角差的值。就是添加到UIScrollView視圖中顯示的圖像或控件的x,y坐標(biāo),初始值為(0,0),設(shè)置之后初始顯示的坐標(biāo)就改變了。
@property(nonatomic)CGSize contentSize;這個屬性?用來表示UIScrollView內(nèi)容的尺?大小,滾動范圍大小。就是要看到的整個視圖范圍包括顯示的和未顯示的。
@property(nonatomic)UIEdgeInsets contentInset; 這個屬性能夠在UIScrollView的四周增加額外的滾動區(qū)域即周圍的厚度。在那個控件的周圍加上一層厚度。
2)其他屬性:
@property(nonatomic) BOOL bounces; d 設(shè)置UIScrollView是否需要彈簧效果。默認(rèn)為YES;
@property(nonatomic,getter=isScrollEnabled)BOOL scrollEnabled; 設(shè)置UIScrollView是否能滾動
@property(nonatomic) BOOL showsHorizontalScrollIndicator; 是否顯?示水平滾動條 。默認(rèn)不顯示。
@property(nonatomic) BOOL showsVerticalScrollIndicator; 是否顯示垂直滾動條 默認(rèn)不顯示。
> UIScrollView代理的使用:
scrollViewDidScroll:只要scrollView在滾動,就會調(diào)用這個方法(監(jiān)聽scrollView的滾動),已經(jīng)開始滾動
-(void)scrollViewDidScroll:(UIScrollView*)scrollView
scrollViewWillBeginDragging:用戶即將開始拖拽scrollView,手指碰到屏幕,并且移動,執(zhí)行一次
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
用戶即將停止拖拽scrollView,就會調(diào)用這個方法
-(void)scrollViewWillEndDragging:(UIScrollView )scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint )targetContentOffset
scrollViewWillBeginDecelerating:scrollView已經(jīng)開始減速,手指離開屏幕,正在滾動的視圖減速,執(zhí)行一次
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
scrollViewDidEndDecelerating:視圖靜止,執(zhí)行一次
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
用戶已經(jīng)停止拖拽scrollView,就會調(diào)用這個方法
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
> UIScrollView其它功能的使用
>>1.縮放功能:
scrollView.minimumZoomScale = 0.05;//設(shè)置可縮小的最小比例
scrollView.maximumZoomScale = 5.0;//設(shè)置可放大的最大比例
/*與縮放有關(guān)的代理方法*/
viewForZoomingInScrollView:指定scrollView的某一個子視圖為可縮放視圖,前提條件是該視圖已經(jīng)添加到scrollView上面
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
UIView *view = [scrollView viewWithTag:1000];
return view;
}
scrollViewWillBeginZooming:withView:開始縮放 第二個參數(shù)是指我們將要縮放的視圖(也就是是指定的view),執(zhí)行一次
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
NSLog(@"%@",view);
}
scrollViewDidZoom:正在縮放的代理方法 只要正在縮放,就會執(zhí)行此方法,所以此方法在縮放過程中會多次調(diào)用
-(void)scrollViewDidZoom:(UIScrollView *)scrollView
{
NSLog(@"%s",__func__);
}
scrollViewDidEndZooming:withView:atScale:縮放結(jié)束執(zhí)行的代理方法, view當(dāng)前正在縮放的視圖,scale當(dāng)前正在縮放視圖的縮放比例,執(zhí)行一次
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
{
NSLog(@"%s",__func__);
}
>> 2.設(shè)置是否分頁:scrollView.pagingEnabled=YES;
>> 如果UIScrollView無法滾動,可能是以下原因:
1. 沒有設(shè)置contentSize/contentSize不能設(shè)置小于全部看到的視圖范圍值,設(shè)置的值是要全部看到的范圍。
2. *很重要的一點(diǎn)是在加入到UIScrollView的控件或者圖片不能在UIScrollView中設(shè)置固定位置即(x,y) 或相對布局固定,左右的對齊方式在使用輪播圖時是可以使用的。scrollEnabled = NO
3. 沒有接收到觸摸事件:userInteractionEnabled = NO
4. 沒有取消autolayout功能(在Sotryboard中添加了scrollView控件,要想scrollView滾動,必須取消autolayout)
查詢: UIScrollView 控件不能滑動原因
**** 使用 UIScrollView + Masonry 布局 ****
在進(jìn)行 UIScrollView subview 布局時,需要進(jìn)行位置postion和size設(shè)置,需要注意以下原因:
1.縱向滑動不使用 left-right 計算確定寬度;橫向滑動不使用 top-bottom 計算確定高度。
2. 使用 Masonry 需使用 width/height 自行設(shè)置確定高度和寬度,并且 left/right top/bottom不能成對出現(xiàn)。
>> 經(jīng)驗(yàn)證,導(dǎo)致不能滑動
1. scrollView.contentSize/contentOffset 前后設(shè)置的對于 UIScrollView 對象本身無任何影響,這二者也只是UIScrollView的兩個屬性, 除非有特殊情況出現(xiàn)。
1. 未設(shè)置 scollView.scrollEnabled = YES;
2. 未設(shè)置 scrollView.contentSize = CGSizeMake(kScreenWidth,kScreenHight*2); // 并且設(shè)置內(nèi)容尺寸要大于設(shè)置的UIScrollView的frame。
3. 在 UIScrollView 對象視圖上添加新的控件或者 UIView 對象后不能使用 Masonry 固定其位置,否則會導(dǎo)致不能滑動。
4. 即 使用 UIScrollView + Masonry 布局不能同時使用,使用另外方法完成 Masonry布局
>> 經(jīng)驗(yàn)證,不能滑動和以下原因無關(guān)
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解決需要滑動的問題,也不失為一種方法。