iOS 關(guān)于UIScrollView的幾點總結(jié)

- 什么是UISCrollView

+ 當手機屏幕需要展示的內(nèi)容較多超出一個屏幕時,用戶可以通過滾動手勢來查看屏幕以外的內(nèi)容

+ 普通的UIView不具備滾動的功能,UIScrollView是一個能夠滾動的視圖控件,可以用來展示大量的內(nèi)容,并且可以通過滾動查看所有的內(nèi)容

---

#### UIScrollView的常見屬性

- UIScrollView滾動的位置

+ 內(nèi)容左上角與scrollView左上角的間距值

```objc

@property (nonatomic) CGPoint contentOffset;

```

- UIScrollView內(nèi)容的尺寸,滾動范圍

```objc

@property (nonatomic) CGSize contentSize;

```

- 在UIScrollView的4周增加額外的滾動區(qū)域,一般用來避免scrollView的內(nèi)容被其它控件擋住

```objc

@property (nonatomic) UIEdgeInsets contentInset;

```

- UIScrollView各尺寸


---

#### UIScrollView的其他屬性

- 回彈效果

```objc

@property (nonatomic) BOOL bounces;

// 取消回彈效果

self.scrollView.bounces = NO;

```

- 是否能滾動

```objc

@property (nonatomic, getter = isScrollEnabled) BOOL scrollEnabled;

```

- 是否顯示水平滾動條

```objc

@property (nonatomic) BOOL showsHorizontalScrollIndicator;

```

- 是否顯示垂直滾動條

```objc

@property (nonatomic) BOOL showsVerticalScrollIndicator;

```

---

#### UIScrollView的基本使用

- 設(shè)置UIScrollView的contentSize屬性,告訴UIScrollView所有內(nèi)容的尺寸,也就是告訴它滾動的范圍

- **`UIScrollView使用步驟`**

+ **`1.創(chuàng)建UIScrollView`-**

+ **`2.將需要展示的內(nèi)容添加到UIScrollView中`**

+ **`3.設(shè)置UIScrollView的滾動范圍(contentSize)`**

- 注意:如果想讓UIScrollView進行滾動,必須設(shè)置可以滾動的范圍,必須設(shè)置可以滾動的范圍

+ 一個控件沒有設(shè)置frame,默認x/y都是0

- `scrollView不能滾動的幾種情況`

+ 沒有設(shè)置contentSize

+ scrollEnabled屬性 = NO; // 代表控件不可用

+ userInteractionEnabled屬性 = NO; // 代表控件不能和用戶交互

- 如何去掉滾動條

```objc

self.scrollView.showsHorizontalScrollIndicator = NO;

self.scrollView.showsVerticalScrollIndicator = NO;

```

- `注意:滾動條也是scrollValue的子控件的一部分`

+ `滾動條可能在子控件的前面,也可能在子控件的后面`

+ 正是因為這個原因,在開發(fā)中不推薦使用subviews獲取子控件的方式

* 當沒有設(shè)置contentSize情況下,滾動條在其它子控件的前面打印,當設(shè)置了contentSize情況下,滾動條在其它子控件后面打印,`這說明了滾動條的位置是不確定的`

- 設(shè)置滾動條的樣式

```objc

@property(nonatomic)? ? ? ? UIScrollViewIndicatorStyle? indicatorStyle;? ? ? ? ? ? ? ? // default is UIScrollViewIndicatorStyleDefault

```

- 默認情況下UIScrollView有一個回彈效果

+ 只要設(shè)置了contentSize就有回彈效果

```objc

// 回彈效果

@property(nonatomic)? ? ? ? BOOL? ? ? ? ? ? ? ? ? ? ? ? bounces;? ? ? ? ? ? ? ? ? ? ? ? // default YES. if YES, bounces past edge of content and back again

```

- 默認如果不設(shè)置contentSize,scrollView是沒有回彈效果的,可是如果設(shè)置了`self.scrollView.alwaysbounceVertical = YES & self.scrollView.alwaysBounceHorizontal = YES `的情況下,水平和垂直方向就都有了回彈效果

+ 一般應(yīng)用于下拉刷新功能

- 設(shè)置邊距

+ contentInset(額外增加的邊距)

```objc

@property(nonatomic)? ? ? ? UIEdgeInsets? ? ? ? ? ? ? ? contentInset;? ? ? ? ? ? ? ? ? // default UIEdgeInsetsZero. add additional scroll area around content

```

- 設(shè)置內(nèi)容偏移位

+ contentOffset(移動的位置是一個臨時的位置,只要輕輕拖拽一下就會回到默認的位置)

* 計算公式:永遠都是 `控件的左上角 - 內(nèi)容的左上角 = 規(guī)定的值`

```objc

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;? // animate at constant velocity to new offset

```

---

#### UIScrollView代理

- 如何監(jiān)聽一個控件的變化/狀態(tài)

+ 首先需要查看該控件的頭文件,看它繼承于誰

* `如果繼承于UIControl,那么就可以通過addTarget來監(jiān)聽`

* `如果繼承于UIView,那么就必須通過代理來監(jiān)聽`

- 代理作用:

+ 當A對象想監(jiān)聽B對象的變化,那么可以讓A成為B的代理

+ 當B對象發(fā)生一些變化想通知A對象,那么可以讓A成為B的代理

* self寫在對象方法中就是當前對象的實例對象

- 代理協(xié)議的規(guī)律:

+ 定義代理都使用id,這樣以后就任意對象都能成為代理(學(xué)官方)

+ 以控件的類名開頭,后面加上delegate

+ 代理協(xié)議可以寫在interface()后面,也可以寫在類擴展后面,都是可以的

- 代理協(xié)議中的方法名的規(guī)律:

+ 一般以控件名稱去掉類前綴開頭

- 代理協(xié)議中的方法參數(shù)的規(guī)律:

+ `誰觸發(fā)事件,就將誰傳遞進來`

- `如何監(jiān)聽UIScrollView的變化`

+ `1.成為UIScrollView的代理`

+ `2.遵守UIScrollView的協(xié)議`

+ `3.實現(xiàn)UIScrollView協(xié)議中的方法`

- 只要成為了UIScrollView的代理,遵守代理協(xié)議,實現(xiàn)協(xié)議中的方法,當UIScrollView放生一些變化的時候,系統(tǒng)就會自動調(diào)用這些代理方法

+ scrollViewDidScroll:方法只要UIScrollView滾動了,系統(tǒng)就會自動調(diào)用

```objc

// 只要UIScrollView滾動就會調(diào)用

// 系統(tǒng)會自動調(diào)用這些方法

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; // any offset changes

// 只要用戶準備開始拖拽就會調(diào)用

// called on start of dragging (may require some time and or distance to move)

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;

// 用戶停止拖拽(已經(jīng)松手)

// 但是并不意味著UIScrollView已經(jīng)停止?jié)L動了,每次調(diào)用此方法時,系統(tǒng)都會傳入一個當前是否有慣性的參數(shù)(decelerate)

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

// UIScrollView停止減速

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;? ? ? // called when scroll view grinds to a halt

```

- 注意:

+ 如果想在UIScrollView停止?jié)L動之后做一些操作,有以下兩種情況:

* 沒有慣性:只會調(diào)用停止拖拽的方法,不會調(diào)用停止減速的方法

* 有慣性:既會調(diào)用停止拖拽的方法,也會調(diào)用停止減速的方法

+ 所以:以后要判斷UIScrollView是否停止?jié)L動,需要同時重寫兩個方法:

* scrollViewDidEndDragging

* scrollViewDidEndDecelerating

```objc

// 在開發(fā)中如果需要監(jiān)聽scrollView滾動是否停止可以這樣寫

- (void)scrollViewDidEndDragging:(nonnull UISrollView *)scrollView willDecelerate:(BOOL)decelerate

{

if(decelerate == NO){

[self scrollViewDidEndDecelerating:scrolView];

}else{

}

}

- (void)scrollViewDidEndDecelerating:(nonnull UIScrollView *)scrollView

{

// 在這里面寫scrollView停止時需要做的事情

NSLog(@"UIScrollView停止?jié)L動了");

}

```

- `為什么代理要用weak`

+ 任何對象都能成為代理,只要兩者之間遵守了代理協(xié)議即可

+ `原因:為了防止循環(huán)引用`

+ 控制器-強引用 -> 控制器的View-強引用 -> subViews數(shù)組-強引用 -> UIScrollView-弱引用 ->? 控制器

+ `如果只有一個控制器的情況,程序一啟動就創(chuàng)建的這個控制器是不會被釋放的`(如果它被釋放,它所執(zhí)行的邏輯肯定不能被執(zhí)行 )

+ 只要數(shù)組中保存了對象,這個數(shù)組就會用強指針指向了這個對象

* **`strong (用于對象, 強指針, 強引用)`**

* **`weak(用于對象, 一般應(yīng)用于控件/代理)`**

* **`copy(用于對象, 字符串, 主要為了防止外界修改內(nèi)部的屬性的值)`**

* **`assign(用于基本數(shù)據(jù)類型,int/float/double...)`**

---

#### UIScrollView縮放

- 要想縮放,除了告訴UIScrollView要縮放哪一個控件以外,還要告訴UIScrollView最小能縮多小,最大能放多大

+ 因為所有的子控件都是我們添加進去的,所以要縮放哪一個我們最清楚

+ 只要讓控制器成為UIScrollView的代理,當UIScrollView不清楚要縮放哪一個控件的時候,UIScrollView就會調(diào)用它的代理方法,問問代理到底要縮放哪一個

```objc

self.sc.maximumZoomScale = 2.0;

self.sc.minimumZoomScale = 0.5;

```

- 縮放圖片分為兩步

+ 成為代理,通過代理方法告訴UIScrollView要縮放哪一個子控件

+ 設(shè)置子控件和最小的縮放比

- 想要縮放,必須明確告訴UIScrollView要縮放哪一個控件,因為UIScrollView中可能有很多子控件

```objc

// 代理方法

// 大部分代理方法是由控件名開頭,小部分不是

// 在此方法中告訴UIScrollView要縮放哪一個控件

- (UIView *)viewForZoomingInScrollView:(nonnull UISCrollView *)scrollView{

return 需要縮放的圖片

}

// 縮放的過程中調(diào)用

- (void)scrlooViewDidZoom:(nonnull UIScrollView *)scrolView{

}

// 縮放結(jié)束時調(diào)用

- (void)scrollViewDidEndZooming:(nonnull UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale{

}

```

---

#### UIScrollView

- 一個控件如果沒有設(shè)置frame,默認x/y就是0

- 如果想讓UIScrollView進行滾動,必須設(shè)置可以滾動的范圍

+ 將需要展示的內(nèi)容添加到UIScrollView中

+ 設(shè)置UIScrollView的contentSize屬性,設(shè)置滾動范圍

```objc

self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width + 100, self.scrollView.frame.size.height + 100);

```

- `注意:`scrollView不能滾動的幾種情況

+ 沒有設(shè)置contentSize

+ scrollEnabled屬性 = NO? (代表控件是否可用)

+ userINteractionEnabled屬性 = NO (代表控件不能和用戶交互,不能響應(yīng)用戶操作)

---

##### UIScrollView使用步驟

- 創(chuàng)建UIScrollView

- 將需要展示內(nèi)容添加到UISCrollView中

- 設(shè)置UISCrollView的滾動范圍(contentSize)

#### UIScrollView圖片輪播器

- pagingEnabled實現(xiàn)分頁的本質(zhì),是按照UIScrollView的寬度或者高度來分頁的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內(nèi)容