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

前言

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

UIScrollView

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

UIScrollView的基本使用

UIScrollView的使用很簡單,基本使用方式如下:

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

UIScrollView的顯示內容的小細節(jié)

  • 超過UIScrollView邊界的內容會被自動隱藏
  • 用戶可以用過拖拽手勢來查看超出UIScrollView邊界被隱藏的內容

UIScrollView無法滾動可能的原因

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

UIScrollView的常用屬性

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

contentOffset用來表示UIScrollView的滾動位置。

具體為內容原點與UIScrollView左上角原點的間距值。

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

contentSize:表示UIScrollView的內容的尺寸,用來設置UIScrollView的滾動范圍。

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

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

以上屬性效果如圖:

Snip20170305_3.png

UIScrollView的其他屬性

  • 彈簧效果
@property(nonatomic) BOOL bounces; // default YES. if YES, bounces past edge of content and back again
  • 是否能滾動
@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled; // default YES. turn off any dragging temporarily
  • 是否顯示水平滾動條
@property(nonatomic) BOOL showsHorizontalScrollIndicator; // default YES. show indicator while we are tracking. fades out after tracking
  • 是否顯示垂直滾動條
@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 是一個很重要的屬性,同時也是一個重要的知識點,所以拿出來著重說一下。

代理思想的引入

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

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


Snip20170305_4.png

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

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

設置UIScrollView的步驟

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


      Snip20170305_5.png
  • 控制器UIScrollViewDelegate
@interface ViewController ()<UIScrollViewDelegate>
  • 實現(xià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內容的縮放

UIScrollView不僅能夠展示大量的內容還能進行內容的縮放。

常見場景

圖庫里面的圖片我們可以通過手勢來進行縮放

Snip20170305_6.png

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

縮放原理

  • 當用戶在UIScrollView身上使用捏合手勢的時候,UIScrollView會調用delegate的viewForZoomingInScollView方法,方法的返回值就是要進行縮放的控件。
Snip20170305_7.png

縮放實現(xiàn)步驟

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

縮放相關的兩個方法

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

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

小結

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

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

相關閱讀更多精彩內容

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

友情鏈接更多精彩內容