前言
本文主要講述了 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的內容被其他控件擋住。
以上屬性效果如圖:

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)的如圖:

所以想成為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不僅能夠展示大量的內容還能進行內容的縮放。
常見場景
圖庫里面的圖片我們可以通過手勢來進行縮放

要實現(xiàn)這樣的功能,我們只需要將圖片放到UIScrollView中去,然后設置縮放比例和要縮放的內容
縮放原理
- 當用戶在UIScrollView身上使用捏合手勢的時候,UIScrollView會調用delegate的viewForZoomingInScollView方法,方法的返回值就是要進行縮放的控件。

縮放實現(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)聽用戶手勢來縮放自己內部子控件。
