UIScrollView

UIScrollView 滾動視圖為展示內(nèi)容比應(yīng)用程序窗口大的視圖提供支持。它允許用戶通過觸控手勢移動內(nèi)容并且通過捏合手勢放大縮小內(nèi)容茶敏。

UIScrollViewIndicatorStyle

UIScrollViewIndicatorStyle 指示器樣式小压,指的是類似于 web 頁面上的邊緣滾動條樣式线梗。

// 設(shè)置指示器(滾動條)樣式,白色
self.scrollerView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
// 加載時閃一下指示器(滾動條)
[self.scrollerView flashScrollIndicators];

UIScrollView 中放一張 2 倍于窗口大小的視圖

視圖層次結(jié)構(gòu):根視圖控制器中添加 UIScrollView 滾動視圖怠益,在 UIScrollView 中添加自定義子視圖 HyponsisView仪搔。

實(shí)現(xiàn)方法:覆蓋 UIViewController 中的 loadView 方法,創(chuàng)建視圖層次結(jié)構(gòu)蜻牢。

- (void)loadView {
//創(chuàng)建一個超大視圖
CGRect screenRect = CGRectMake(0, 0, 414, 736);
//創(chuàng)建一個 UIScrollView 對象烤咧,將其尺寸設(shè)置為窗口大小
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:screenRect];
self.view = scrollView;

// HyponsisView 的視圖大小是窗口的2倍
CGRect bigRect = screenRect;
bigRect.size.width *= 2.0;
bigRect.size.height *= 2.0;
  
//創(chuàng)建一個有著超大尺寸的 HQLHypnosisView 對象并將其加入 UIScrollView 對象
HQLHypnosisView *hyponsisView = [[HQLHypnosisView alloc]initWithFrame:bigRect];

[scrollView addSubview:hyponsisView];

//告訴 UIScrollView 對象“取景”范圍有多大
scrollView.contentSize = bigRect.size;
}

UIScrollView 中放左右兩張視圖

UIScrollView 滾動視圖的分頁顯示實(shí)現(xiàn)原理:UIScrollView 對象會根據(jù)其 bounds 的尺寸,將 contentSize 分割為尺寸相同的多個區(qū)域抢呆。拖動結(jié)束后煮嫌,UIScrollView 實(shí)例會自動滾動并只顯示其中的一個區(qū)域。

同樣覆蓋 loadView 方法創(chuàng)建視圖層次結(jié)構(gòu):

// 創(chuàng)建兩個 CGRect 結(jié)構(gòu)分別作為 `UIScrollView` 對象和 `HQLHypnosisView` 對象的 `frame`
CGRect screenRect = CGRectMake(0, 0, 414, 736);

// 創(chuàng)建一個 UIScrollView 對象抱虐,將其尺寸設(shè)置為窗口大小
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:screenRect];

// 設(shè)置 UIScrollView 對象的“鏡頭”的邊和其顯示的某個視圖的邊對齊
[scrollView setPagingEnabled:YES];
self.view = scrollView;

CGRect bigRect = screenRect;
bigRect.size.width *= 2.0;

// 創(chuàng)建一個大小與屏幕相同的 HQLPictureView 對象并將其加入 UIScrollView 對象
HQLPictureView *pictureView = [[HQLPictureView alloc]initWithFrame:screenRect];
[scrollView addSubview:pictureView];

// 創(chuàng)建第二個大小與屏幕相同的 HQLHypnosisView 對象并放置在第一個 HQLPictureView 對象的右側(cè)昌阿,使其剛好移除屏幕外
screenRect.origin.x +=screenRect.size.width;

HQLHypnosisView *anotherView = [[HQLHypnosisView alloc]initWithFrame:screenRect];

[scrollView addSubview:anotherView];

// 告訴 UIScrollView 對象“取景”范圍有多大
scrollView.contentSize=bigRect.size;

UIScrollViewDelegate 方法

// 該方法在 contentOffset 發(fā)生變化時調(diào)用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // !!!: 判斷手指滑動方向    
    CGPoint translatedPoint = [scrollView.panGestureRecognizer translationInView:scrollView];
    if (translatedPoint.y < 0) {
        NSLog(@"手指從下往上滑,瀏覽更多內(nèi)容");
    } else if (translatedPoint.y > 0) {
        NSLog(@"手指從上往下滑,返回頂部");
    }
}

// 該方法在「將要開始拖拽時」調(diào)用
// 注:該方法可能需要先滑動一段時間(150ms)或距離才會被調(diào)用
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

// 該方法在「用戶停止拖拽時」調(diào)用懦冰,以 velocity 為初速度灶轰,直到 targetContentOffset 停止。
// 應(yīng)用程序可以通過修改 targetContentOffset 參數(shù)的值來調(diào)整停止的位置
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

// 該方法在「用戶停止拖拽時」調(diào)用
// 如果在停止拖拽后繼續(xù)移動刷钢,則 decelerate 參數(shù)為 YES笋颤,如果 decelerate(減速) 為 NO 時,表示`滑動動畫結(jié)束`
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

// 該方法在「將要開始減速時」調(diào)用内地,(手指已經(jīng)離開屏幕伴澄,但 scrollView 仍在減速滑動中)
// 僅當(dāng)停止拖拽后繼續(xù)移動時才會被調(diào)用
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

// 該方法在「已經(jīng)結(jié)束減速時」調(diào)用
// 僅當(dāng)停止拖拽后繼續(xù)移動時才會被調(diào)用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

// 該方法用于返回是否允許點(diǎn)擊狀態(tài)欄讓 scrollView 滑動到頂部,默認(rèn)值為 YES
// 僅當(dāng) scrollsToTop 屬性值為 YES 時才調(diào)用
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
    return YES;
}

// 該方法在 scrollView 已經(jīng)滑動到頂部時調(diào)用
// 僅當(dāng)通過點(diǎn)擊狀態(tài)欄讓 scrollView 滑動到頂部才調(diào)用
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

// 該方法在 -setContentOffset:animated:/-scrollRectVisible:animated: 方法動畫結(jié)束時調(diào)用
// 僅當(dāng) animated 設(shè)置為 YES 時才調(diào)用
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

// 該方法在縮放比例發(fā)生變化時調(diào)用
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

// 該方法用于返回參與縮放的子視圖
// return a view that will be scaled. if delegate returns nil, nothing happens
- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return nil;
}

// 該方法在將要開始縮放時調(diào)用
// called before the scroll view begins zooming its content
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view API_AVAILABLE(ios(3.2)) {
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

// 該方法在已經(jīng)結(jié)束縮放時調(diào)用
// scale between minimum and maximum. called after any 'bounce' animations
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale {
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

// 該方法在 adjustedContentInset 發(fā)生變化時調(diào)用
- (void)scrollViewDidChangeAdjustedContentInset:(UIScrollView *)scrollView {
    NSLog(@"%s",__PRETTY_FUNCTION__);
}

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓤鼻,一起剝皮案震驚了整個濱河市秉版,隨后出現(xiàn)的幾起案子贤重,更是在濱河造成了極大的恐慌茬祷,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件并蝗,死亡現(xiàn)場離奇詭異祭犯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)滚停,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門沃粗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人键畴,你說我怎么就攤上這事最盅。” “怎么了起惕?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵涡贱,是天一觀的道長。 經(jīng)常有香客問我惹想,道長问词,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任嘀粱,我火速辦了婚禮激挪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锋叨。我一直安慰自己垄分,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布娃磺。 她就那樣靜靜地躺著薄湿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘿般,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天段标,我揣著相機(jī)與錄音,去河邊找鬼炉奴。 笑死逼庞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞻赶。 我是一名探鬼主播赛糟,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砸逊!你這毒婦竟也來了璧南?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤师逸,失蹤者是張志新(化名)和其女友劉穎司倚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篓像,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡动知,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了员辩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盒粮。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奠滑,靈堂內(nèi)的尸體忽然破棺而出丹皱,到底是詐尸還是另有隱情,我是刑警寧澤宋税,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布摊崭,位于F島的核電站,受9級特大地震影響弃甥,放射性物質(zhì)發(fā)生泄漏爽室。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一淆攻、第九天 我趴在偏房一處隱蔽的房頂上張望阔墩。 院中可真熱鬧,春花似錦瓶珊、人聲如沸啸箫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忘苛。三九已至蝉娜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扎唾,已是汗流浹背召川。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胸遇,地道東北人荧呐。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像纸镊,于是被迫代替她去往敵國和親倍阐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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