iOS回顧筆記(04) -- UIScrollView的基本使用詳解

前言

本文主要講述了 UIScrollView 的一些常用的屬性和方法、引申了delegate的思想和UIScrollView的縮放。這篇文章著重介紹UIScrollView的基本知識(shí),關(guān)于UIScrollView的實(shí)例使用我會(huì)在下一篇iOS回顧筆記(05)中著重講解。

UIScrollView

  • UIScrollView :顧名思義就是 可以滾動(dòng)的 UIView。
  • 由于手機(jī)的屏幕比較小,所以直接可以展示在用戶眼前的內(nèi)容極其有限
  • 當(dāng)展示的內(nèi)容較多且超出一個(gè)屏幕時(shí),用戶可以通過手勢(shì)滑動(dòng)來查看屏幕以外的東西
  • 普通的UIView不具備滾動(dòng)的功能,所以不適合展示較多的內(nèi)容
  • UIScrollView就是一個(gè)可以滾動(dòng)的UIView,用來展示大量的內(nèi)容,并且可以通過滾動(dòng)來展示所有內(nèi)容
  • UIScrollView實(shí)例:手機(jī)上可上下滑動(dòng)的頁面都是,如QQ聊天頁面

UIScrollView的基本使用

UIScrollView的使用很簡(jiǎn)單,基本使用方式如下:

  • 將需要展示的內(nèi)容添加到UIScrollView中
  • 設(shè)置UIScrollView的 contentSize屬性,告訴它它內(nèi)容的尺寸,也就是設(shè)置它的可滾動(dòng)范圍
// 1.創(chuàng)建滾動(dòng)視圖
UIScrollView *scrollView = [[UIScrollView alloc] init];
scrollView.frame = CGRectMake(0,0,375,150);
[self addSubview:scrollView];
        
// 2. 設(shè)置內(nèi)容
[scrollView addSubview:[UIImageView new]];
        
// 3. 設(shè)置滾動(dòng)范圍
scrollView.contentSize = CGSizeMake(ImageViewCount * self.bounds.size.width, 0);

UIScrollView的顯示內(nèi)容的小細(xì)節(jié)

  • 超過UIScrollView邊界的內(nèi)容會(huì)被自動(dòng)隱藏
  • 用戶可以用過拖拽手勢(shì)來查看超出UIScrollView邊界被隱藏的內(nèi)容

UIScrollView無法滾動(dòng)可能的原因

  • 未設(shè)置 contentSize,不知滾動(dòng)的范圍
  • scrollEnable = NO; 可滾動(dòng)屬性設(shè)置為NO
  • userInteractionEnable = NO; 未接受用戶事件

UIScrollView的常用屬性

  • 內(nèi)容偏移量:contentOffset
@property(nonatomic) CGPoint contentOffset;  // default CGPointZero

contentOffset用來表示UIScrollView的滾動(dòng)位置。

具體為內(nèi)容原點(diǎn)與UIScrollView左上角原點(diǎn)的間距值。

  • 內(nèi)容大?。篶ontentSize
@property(nonatomic) CGPoint contentSize;  // default CGSizeZero

contentSize:表示UIScrollView的內(nèi)容的尺寸,用來設(shè)置UIScrollView的滾動(dòng)范圍。

  • 額外滾動(dòng)區(qū)域:contentInset
@property(nonatomic) UIEdgeInsets contentInset; // default UIEdgeInsetsZero. add additional scroll area around content

contentInset:可以在UIScrollView的四周增加額外的滾動(dòng)區(qū)域??梢杂脕肀苊釻IScrollView的內(nèi)容被其他控件擋住。

以上屬性效果如圖:

Snip20170305_3.png

UIScrollView的其他屬性

  • 彈簧效果
@property(nonatomic) BOOL bounces; // default YES. if YES, bounces past edge of content and back again
  • 是否能滾動(dòng)
@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled; // default YES. turn off any dragging temporarily
  • 是否顯示水平滾動(dòng)條
@property(nonatomic) BOOL showsHorizontalScrollIndicator; // default YES. show indicator while we are tracking. fades out after tracking
  • 是否顯示垂直滾動(dòng)條
@property(nonatomic) BOOL showsVerticalScrollIndicator; // default YES. show indicator while we are tracking. fades out after tracking
  • UIScrollView的Delegate(代理)
@property(nullable,nonatomic,weak) id<UIScrollViewDelegate> delegate; // default nil. weak reference

UIScrollView的Delegate

Deleagate 是一個(gè)很重要的屬性,同時(shí)也是一個(gè)重要的知識(shí)點(diǎn),所以拿出來著重說一下。

代理思想的引入

  • 通常,我們會(huì)在UIScrollView 正在滾動(dòng)、滾到到某個(gè)位置、停止?jié)L動(dòng)等情況下做一些特定的操作
  • 若想完成以上操作,需要對(duì)UIScrollView的各個(gè)狀態(tài)進(jìn)行“監(jiān)聽”,這個(gè)監(jiān)聽者就是我們說的代理
  • 當(dāng)UIScrollView發(fā)生一系列滾動(dòng)操作時(shí),會(huì)自動(dòng)發(fā)送消息給它的代理對(duì)象,通知它當(dāng)下的實(shí)時(shí)滾動(dòng)狀態(tài)。
  • 總結(jié)一下就是,如果想要監(jiān)聽UIScrollView的實(shí)時(shí)滾動(dòng)狀況,我們就要給它設(shè)置代理,然后通過代理來得知它的實(shí)時(shí)滾動(dòng)情況

實(shí)際上UIScrollView通知delegate自己的相關(guān)狀態(tài)就是通過給代理發(fā)消息實(shí)現(xiàn)的如圖:


Snip20170305_4.png

所以想成為UIScrollView的代理是需要遵循如下條件的

@property(nullable,nonatomic,weak) id<UIScrollViewDelegate> delegate;
  • UIScrollView把代理需要實(shí)現(xiàn)的方法都定義在了UIScrollViewDelegate當(dāng)中
  • 成為代理必須遵守UIScrollViewDelegate這個(gè)協(xié)議,其本身可以是 id 類型的對(duì)象(任意類型對(duì)象)
  • 代理對(duì)象必須實(shí)現(xiàn)UIScrollViewDelegate中相對(duì)應(yīng)的方法,才能監(jiān)聽UIScrollView相應(yīng)的狀態(tài)

設(shè)置UIScrollView的步驟

  • 通常情況下UIScrollView的代理都是控制器,設(shè)置方法有兩種
    • 代碼: scrollView.delegate = self;
    • storyBoard/Xib拖線:


      Snip20170305_5.png
  • 控制器UIScrollViewDelegate
@interface ViewController ()<UIScrollViewDelegate>
  • 實(shí)現(xiàn)相對(duì)應(yīng)的代理方法,進(jìn)行監(jiān)聽
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    // 監(jiān)聽代碼
}
- (void)scrollViewDidZoom:(UIScrollView *)scrollView NS_AVAILABLE_IOS(3_2){
    // 監(jiān)聽代碼
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
    // 監(jiān)聽代碼
}

···

UIScrollView內(nèi)容的縮放

UIScrollView不僅能夠展示大量的內(nèi)容還能進(jìn)行內(nèi)容的縮放。

常見場(chǎng)景

圖庫(kù)里面的圖片我們可以通過手勢(shì)來進(jìn)行縮放

Snip20170305_6.png

要實(shí)現(xiàn)這樣的功能,我們只需要將圖片放到UIScrollView中去,然后設(shè)置縮放比例和要縮放的內(nèi)容

縮放原理

  • 當(dāng)用戶在UIScrollView身上使用捏合手勢(shì)的時(shí)候,UIScrollView會(huì)調(diào)用delegate的viewForZoomingInScollView方法,方法的返回值就是要進(jìn)行縮放的控件。
Snip20170305_7.png

縮放實(shí)現(xiàn)步驟

  • 設(shè)置UIScrollView的代理對(duì)象
  • 設(shè)置minimumZoomScale;// default is 1.0 最小縮放比例
  • 設(shè)置maximumZoomScale;// default is 1.0. 最大縮放比例
  • 代理實(shí)現(xiàn)viewForZoomingInScrollView方法返回要進(jìn)行縮放的控件

縮放相關(guān)的兩個(gè)方法

// 將要開始縮放
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view NS_AVAILABLE_IOS(3_2); // called before the scroll view begins zooming its content

// 結(jié)束縮放
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale; // scale between minimum and maximum. called after any 'bounce' animations

小結(jié)

UIScrollView是iOS開發(fā)中常常用到的一個(gè)控件,通常用來展示比較多的內(nèi)容,我們可以通過給他設(shè)置代理實(shí)現(xiàn)它的代理方法進(jìn)行監(jiān)聽,通過監(jiān)聽不同的狀態(tài)來做對(duì)應(yīng)的一些操作。
它可以監(jiān)聽用戶手勢(shì)來縮放自己內(nèi)部子控件。

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 關(guān)于UIStrollview: UIScrollView無法滾動(dòng)可能的原因及解決辦法: ?沒有設(shè)置contentS...
    4d49353c3819閱讀 1,659評(píng)論 0 0
  • 掌握 UIScrollView的常見屬性 UIScrollView的常用代理方法 UIScrollView的縮放 ...
    JonesCxy閱讀 2,873評(píng)論 1 12
  • 什么是UIScrollView? 移動(dòng)設(shè)備的屏幕大小是極其有限的,因此直接展示在用戶眼前的內(nèi)容也相當(dāng)有限 當(dāng)展示的...
    游某人閱讀 678評(píng)論 0 2
  • - 什么是UISCrollView + 當(dāng)手機(jī)屏幕需要展示的內(nèi)容較多超出一個(gè)屏幕時(shí),用戶可以通過滾動(dòng)手勢(shì)來查看屏幕...
    Alan張洋閱讀 22,232評(píng)論 2 19
  • 看不透的世事,看別人的愛恨糾葛,有時(shí)候也會(huì)覺得可惜與無奈。愛的背后要有多少信任才能廝守,背叛的背后要有多少墮落才會(huì)...
    閱客聽閱讀 162評(píng)論 0 0

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