iOS控件--UIScrollView--滑動(dòng)控件

UIScrollView是一個(gè)能夠滾動(dòng)的視圖控件,可以滑動(dòng)來(lái)展示大量的內(nèi)容,并且可以讓用戶通過(guò)滾動(dòng)拖拽手勢(shì)查看所有的內(nèi)容;也可以通過(guò)捏合手勢(shì)來(lái)放大或縮小觀看的內(nèi)容。

> UIScrollView的使用步驟:

    1. 將需要展示的內(nèi)容添加到UIScrollView中。
    1. 設(shè)置UIScrollView的contentSize屬性,告訴UIScrollView所有內(nèi)容的尺寸,也就是告訴 它滾動(dòng)的范圍。
    1. 其中很重要的一點(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)題,也不失為一種方法。

以上是對(duì) UIScrollView 控件的描述和使用,不以偏概全,只授之以漁,有更好的操作也會(huì)及時(shí)更新如果您有UIScrollView控件的更好使用歡迎留言交流!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、簡(jiǎn)介 <<繼承關(guān)系:UIScrollView --> UIView-->UIResponder-->NSObj...
    無(wú)邪8閱讀 2,072評(píng)論 0 0
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,052評(píng)論 4 61
  • 你可以天天去約會(huì),但你一定要時(shí)刻保持分寸; 你可以有很多備胎,但你一定要做到心中有數(shù); 有時(shí)候,較高的顏值和過(guò)硬的...
    丹娜服飾色彩手繪閱讀 689評(píng)論 0 2
  • 春光無(wú)限好,外面到處是毛茸茸的綠意,窩在家里也是太負(fù)春光,于是我們仨踏青去。 田野里,麥苗青青,遠(yuǎn)遠(yuǎn)望去,一塊塊麥...
    簡(jiǎn)一jy閱讀 557評(píng)論 1 1
  • 撒花 ?(???????)?第一次鹵雞爪,還算成功吧 口感嘛有嚼勁但不腥,表面彈性十足中間較為軟糯,“經(jīng)”道感非常...
    廟殊閱讀 224評(píng)論 0 0

友情鏈接更多精彩內(nèi)容