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