前言
本文主要講述了 UIScrollView 的一些常用的屬性和方法宏娄、引申了delegate的思想和UIScrollView的縮放逮壁。這篇文章著重介紹UIScrollView的基本知識窥淆,關(guān)于UIScrollView的實例使用我會在下一篇iOS回顧筆記(05)中著重講解忧饭。
UIScrollView
- UIScrollView :顧名思義就是 可以滾動的 UIView。
- 由于手機(jī)的屏幕比較小蜒秤,所以直接可以展示在用戶眼前的內(nèi)容極其有限
- 當(dāng)展示的內(nèi)容較多且超出一個屏幕時作媚,用戶可以通過手勢滑動來查看屏幕以外的東西
- 普通的UIView不具備滾動的功能纸泡,所以不適合展示較多的內(nèi)容
- UIScrollView就是一個可以滾動的UIView赖瞒,用來展示大量的內(nèi)容,并且可以通過滾動來展示所有內(nèi)容
- UIScrollView實例:手機(jī)上可上下滑動的頁面都是磷仰,如QQ聊天頁面
UIScrollView的基本使用
UIScrollView的使用很簡單境蔼,基本使用方式如下:
- 將需要展示的內(nèi)容添加到UIScrollView中
- 設(shè)置UIScrollView的 contentSize屬性箍土,告訴它它內(nèi)容的尺寸吴藻,也就是設(shè)置它的可滾動范圍
// 1.創(chuà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è)置滾動范圍
scrollView.contentSize = CGSizeMake(ImageViewCount * self.bounds.size.width, 0);
UIScrollView的顯示內(nèi)容的小細(xì)節(jié)
- 超過UIScrollView邊界的內(nèi)容會被自動隱藏
- 用戶可以用過拖拽手勢來查看超出UIScrollView邊界被隱藏的內(nèi)容
UIScrollView無法滾動可能的原因
- 未設(shè)置 contentSize沟堡,不知滾動的范圍
- scrollEnable = NO; 可滾動屬性設(shè)置為NO
- userInteractionEnable = NO航罗; 未接受用戶事件
UIScrollView的常用屬性
- 內(nèi)容偏移量:contentOffset
@property(nonatomic) CGPoint contentOffset; // default CGPointZero
contentOffset用來表示UIScrollView的滾動位置伤哺。
具體為內(nèi)容原點與UIScrollView左上角原點的間距值。
- 內(nèi)容大芯钔:contentSize
@property(nonatomic) CGPoint contentSize; // default CGSizeZero
contentSize:表示UIScrollView的內(nèi)容的尺寸茫舶,用來設(shè)置UIScrollView的滾動范圍饶氏。
- 額外滾動區(qū)域:contentInset
@property(nonatomic) UIEdgeInsets contentInset; // default UIEdgeInsetsZero. add additional scroll area around content
contentInset:可以在UIScrollView的四周增加額外的滾動區(qū)域疹启『把拢可以用來避免UIScrollView的內(nèi)容被其他控件擋住荤懂。
以上屬性效果如圖:
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)進(jìn)行“監(jiān)聽”膛壹,這個監(jiān)聽者就是我們說的代理
- 當(dāng)UIScrollView發(fā)生一系列滾動操作時,會自動發(fā)送消息給它的代理對象肩民,通知它當(dāng)下的實時滾動狀態(tài)持痰。
- 總結(jié)一下就是工窍,如果想要監(jiān)聽UIScrollView的實時滾動狀況患雏,我們就要給它設(shè)置代理纵苛,然后通過代理來得知它的實時滾動情況
實際上UIScrollView通知delegate自己的相關(guān)狀態(tài)就是通過給代理發(fā)消息實現(xiàn)的如圖:
所以想成為UIScrollView的代理是需要遵循如下條件的
@property(nullable,nonatomic,weak) id<UIScrollViewDelegate> delegate;
- UIScrollView把代理需要實現(xiàn)的方法都定義在了UIScrollViewDelegate當(dāng)中
- 成為代理必須遵守UIScrollViewDelegate這個協(xié)議取试,其本身可以是 id 類型的對象(任意類型對象)
- 代理對象必須實現(xiàn)UIScrollViewDelegate中相對應(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>
- 實現(xiàn)相對應(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)容的縮放兆龙。
常見場景
圖庫里面的圖片我們可以通過手勢來進(jìn)行縮放
要實現(xiàn)這樣的功能慰安,我們只需要將圖片放到UIScrollView中去聪铺,然后設(shè)置縮放比例和要縮放的內(nèi)容
縮放原理
- 當(dāng)用戶在UIScrollView身上使用捏合手勢的時候铃剔,UIScrollView會調(diào)用delegate的viewForZoomingInScollView方法,方法的返回值就是要進(jìn)行縮放的控件。
縮放實現(xiàn)步驟
- 設(shè)置UIScrollView的代理對象
- 設(shè)置minimumZoomScale;// default is 1.0 最小縮放比例
- 設(shè)置maximumZoomScale;// default is 1.0. 最大縮放比例
- 代理實現(xiàn)viewForZoomingInScrollView方法返回要進(jìn)行縮放的控件
縮放相關(guān)的兩個方法
// 將要開始縮放
- (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ā)中常常用到的一個控件,通常用來展示比較多的內(nèi)容踱蠢,我們可以通過給他設(shè)置代理實現(xiàn)它的代理方法進(jìn)行監(jiān)聽棋电,通過監(jiān)聽不同的狀態(tài)來做對應(yīng)的一些操作茎截。
它可以監(jiān)聽用戶手勢來縮放自己內(nèi)部子控件。