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__);
}