亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開發之UIScrollView控件詳解

2020-07-26 03:10:07
字體:
來源:轉載
供稿:網友

一、UIScrollView控件是什么?

    (1)移動設備的屏幕⼤大⼩小是極其有限的,因此直接展⽰示在⽤用戶眼前的內容也相當有限

    (2)當展⽰示的內容較多,超出⼀一個屏幕時,⽤用戶可通過滾動⼿手勢來查看屏幕以外的內容

    (3)普通的UIView不具備滾動功能,不能顯⽰示過多的內容

    (4)UIScrollView是一個能夠滾動的視圖控件,可以⽤用來展⽰示⼤大量的內容,并且可以通過滾 動查看所有的內容

    (5)  舉例:手機上的“設置”、其他⽰示例程序

二、UIScrollView的簡單使用

(1)將需要展⽰的內容添加到UIScrollView中

(2)設置UIScrollView的contentSize屬性,告訴UIScrollView所有內容的尺⼨寸,也就是告訴 它滾動的范圍(能滾多遠,滾到哪⾥里是盡頭)

注: 本文中所說的"內容視圖"在官方文檔中稱作"content view",表示UIScrollView中可以用來展示內容的部分

三、屬性與方法

內容視圖相關

// 內容視圖的大小,默認為CGSizeZero@property(nonatomic) CGSize contentSize;// 為內容視圖周圍增加可滾動區域,默認為UIEdgeInsetsZero@property(nonatomic) UIEdgeInsets contentInset;// 內容視圖的原點相對于scrollView的原點的偏移量(左上方向偏移為正數),默認為CGPointZero@property(nonatomic) CGPoint contentOffset;// 設置內容視圖的原點相對于scrollView的原點的偏移量- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;

滑動相關

// 是否允許滑動,默認為YES@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;// 是否只允許同時滑動一個方向,默認為NO,如果設置為YES,用戶在水平/豎直方向開始進行滑動,便禁止同時在豎直/水平方向滑動(注: 當用戶在對角線方向開始進行滑動,則本次滑動可以同時在任何方向滑動)@property(nonatomic, getter=isDirectionalLockEnabled) BOOL directionalLockEnabled;// 是否允許點擊狀態欄讓距離狀態欄最近的scrollView滑動到頂部,默認為YES(注: 在iPhone中如果有多個將該屬性設置為YES的scrollView,則該方法無效;在iPad中則將距離狀態欄最近的scrollView滑動到頂部)@property(nonatomic) BOOL scrollsToTop;// 是否按頁數進行滑動,默認為NO,如果設置為YES,則在滑動時只會停止在scrollView的bounds的倍數處@property(nonatomic, getter=isPagingEnabled) BOOL pagingEnabled;// 是否有觸底反彈效果,默認為YES@property(nonatomic) BOOL bounces;// 是否總是有觸底反彈效果(即使內容視圖小于scrollView的大小),默認為NO(注: 生效的前提條件為bounces = YES)@property(nonatomic) BOOL alwaysBounceHorizontal;@property(nonatomic) BOOL alwaysBounceVertical;// 指定用戶手指離開屏幕后滑動減速的比率,默認為UIScrollViewDecelerationRateNormal(慢慢停止),其余可選項為UIScrollViewDecelerationRateFast(快速停止)@property(nonatomic) CGFloat decelerationRate;// 將指定區域滑動到剛好可見處(即距離邊緣最近處)- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;

指示器相關

// 指示器樣式,默認為UIScrollViewIndicatorStyleDefault(黑內容白邊框,適用于任何背景),其余可選項為UIScrollViewIndicatorStyleBlack(全黑)和UIScrollViewIndicatorStyleWhite(全白)@property(nonatomic) UIScrollViewIndicatorStyle indicatorStyle;// 為指示器周圍增加可滾動區域,默認為UIEdgeInsetsZero@property(nonatomic) UIEdgeInsets scrollIndicatorInsets;// 是否在滑動時指示器可見,默認為YES@property(nonatomic) BOOL showsHorizontalScrollIndicator;@property(nonatomic) BOOL showsVerticalScrollIndicator;// 閃一下指示器(注: 建議在scrollView展示給用戶時調用一下,以提醒用戶該處可滑動)- (void)flashScrollIndicators;

事件相關

UIScrollView處理觸摸事件原理

當用戶在UIScrollView的一個子視圖上按下時,UIScrollView并不知道用戶是想要滑動內容視圖還是點擊對應子視圖,所以在按下的一瞬間,事件UIEvent從UIApplication傳遞到UIScrollView后,其會先將該事件攔截而不會立即傳遞給對應的子視圖,同時開始一個150ms的倒計時,并監聽用戶接下來的行為

     1、當倒計時結束前,如果用戶的手指發生了移動,則直接滾動內容視圖,不會將該事件傳遞給對應的子視圖;

     2、當倒計時結束時,如果用戶的手指位置沒有改變,則調用自身的-touchesShouldBegin:withEvent:inContentView:方法詢問是否將事件傳遞給對應的子視圖(如果返回NO,則該事件不會傳遞給對應的子視圖,如果返回YES,則該事件會傳遞給對應的子視圖,默認為YES)

     3、當事件被傳遞給子視圖后,如果手指位置又發生了移動,則調用自身的-touchesShouldCancelInContentView:方法詢問是否取消已經傳遞給子視圖的事件

// 返回是否用戶已經觸碰了內容視圖準備進行滑動(注: 該值被設置為YES的時候可能用戶只是觸碰了內容視圖,但是并沒有開始進行滑動)@property(nonatomic,readonly,getter=isTracking) BOOL tracking;// 返回是否用戶已經開始滑動內容視圖(注: 該值被設置為YES之前可能需要先滑動一段時間或距離)@property(nonatomic,readonly,getter=isDragging) BOOL dragging;// 返回是否處于減速狀態(即手指已經離開屏幕,但scrollView仍然處于滑動中)@property(nonatomic,readonly,getter=isDecelerating) BOOL decelerating;// 是否延遲事件傳遞,默認為YES,如果設置為NO,scrollView會立即調用-touchesShouldBegin:withEvent:inContentView:方法以進行下一步操作@property(nonatomic) BOOL delaysContentTouches;// 是否可以取消內容視圖被觸摸,默認為YES,如果設置為NO,則一旦開始跟蹤事件,即使手指進行移動也不會取消已經傳遞給子視圖的事件@property(nonatomic) BOOL canCancelContentTouches;// 在UIScrollView的子類中重寫該方法,用于返回是否將事件傳遞給對應的子視圖,默認返回YES,如果返回NO,該事件不會傳遞給對應的子視圖- (BOOL)touchesShouldBegin:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view;// 在UIScrollView的子類中重寫該方法,用于返回是否取消已經傳遞給子視圖的事件,默認當子視圖是UIControl時返回NO,否則返回YES(注: 該方法被調用的前提是canCancelContentTouches = YES)- (BOOL)touchesShouldCancelInContentView:(UIView *)view;

縮放相關

當用戶使用兩個手指進行縮放操作時,我們調整內容視圖的偏移量和縮放比例(注: 用戶兩個手指操作結束后,有可能仍然有一個手指在操作,這時不會將事件傳遞給子視圖)

// 最小縮放比例,默認為1.0@property(nonatomic) CGFloat minimumZoomScale;// 最大縮放比例,默認為1.0(必須大于minimumZoomScale才能正常工作)@property(nonatomic) CGFloat maximumZoomScale;// 縮放比例,默認為1.0@property(nonatomic) CGFloat zoomScale;// 設置縮放比例- (void)setZoomScale:(CGFloat)scale animated:(BOOL)animated;// 縮放到指定區域- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated;// 是否允許觸底反彈,默認為YES@property(nonatomic) BOOL bouncesZoom;// 返回是否正在縮放@property(nonatomic,readonly,getter=isZooming) BOOL zooming;// 返回是否正在觸底反彈@property(nonatomic,readonly,getter=isZoomBouncing) BOOL zoomBouncing;

鍵盤相關

// 隱藏鍵盤模式,默認為UIScrollViewKeyboardDismissModeNone(不隱藏鍵盤),其余可選項為UIScrollViewKeyboardDismissModeOnDrag(當拖拽scrollView時隱藏鍵盤)和UIScrollViewKeyboardDismissModeInteractive(當拖拽鍵盤上方時隱藏鍵盤)@property(nonatomic) UIScrollViewKeyboardDismissMode keyboardDismissMode;

代理

滑動相關

// 當scrollView的contentOffset發生變化時調用- (void)scrollViewDidScroll:(UIScrollView *)scrollView;// 將要開始拖拽時調用(注: 該方法可能需要先滑動一段時間或距離才會被調用)- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;// 當用戶停止拖拽時調用(注: 應用程序可以通過修改targetContentOffset參數的值來調整內容視圖content view停止的位置)- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset;// 當用戶停止拖拽時調用(注: 如果內容視圖content view在停止拖拽后繼續移動,則decelerate參數為YES)- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;// 將要開始減速時調用(僅當停止拖拽后繼續移動時才會被調用)- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;// 已經結束減速時調用(僅當停止拖拽后繼續移動時才會被調用)- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;// 返回是否允許點擊狀態欄讓scrollView滑動到頂部,如果未實現該方法,則默認為YES(僅當scrollsToTop屬性為YES時才調用)- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;// 當scrollView已經滑動到頂部時調用(僅當點擊狀態欄讓scrollView滑動到頂部才調用)- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;// 當-setContentOffset:animated:/-scrollRectVisible:animated:方法動畫結束時調用(僅當animated設置為YES時才調用)- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;

縮放相關

// 當縮放比例更改時調用- (void)scrollViewDidZoom:(UIScrollView *)scrollView;// 參與縮放的子視圖- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;// 將要開始縮放時調用- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view;// 已經結束縮放時調用- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale;

常見需求原理解析

導航欄半透明效果


原理解析:

默認情況下,在有UINavigationBar存在時,系統為了防止UIScrollView被遮擋,其contentInset和scrollIndicatorInsets屬性都會被設置為UIEdgeInsetsMake(64, 0, 0, 0);在有UITabBar存在時,系統為了防止UIScrollView被遮擋,其contentInset和scrollIndicatorInsets屬性都會被設置為UIEdgeInsetsMake(0, 0, 49, 0)

因此,為了使用此種半透明效果,可以直接將UIScrollView的frame設置為整個屏幕的大小

    注1: 系統只在UIScrollView是控制器視圖的第0個子視圖時才會自動修改contentInset和scrollIndicatorInsets屬性

    注2: 如果不想讓系統自動修改contentInset和scrollIndicatorInsets屬性,可以設置self.automaticallyAdjustsScrollViewInsets = NO;

控件懸停


原理解析:

    方式一: 在懸停位置放置一個與待懸停控件相同的控件,通過-scrollViewDidScroll:代理方法跟蹤contentOffset的的變化,當不滿足懸停條件時,將該控件hidden屬性設置為YES;當滿足懸停條件時,將該控件hidden屬性設置為NO

    方式二: 通過-scrollViewDidScroll:代理方法跟蹤contentOffset的的變化,當不滿足懸停條件時,待懸??丶儆赨IScrollView的子視圖,當滿足懸停條件時,待懸??丶儆赨IScrollView的父視圖的子視圖

// 以"方式二"為例- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ if (scrollView.contentOffset.y >= 100) {  CGRect rect = label.frame;  rect.origin.y = 0;  label.frame = rect;  [self.view addSubview:label]; } else {  CGRect rect = label.frame;  rect.origin.y = 100;  label.frame = rect;  [scrollView addSubview:label]; }}

下拉頭部圖片放大


原理解析:

通過-scrollViewDidScroll:代理方法跟蹤contentOffset的的變化,根據contentOffset動態設置圖片的縮放比例

// 以"動態修改圖片縮放比例于1倍和2倍之間"為例- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ CGFloat scale = 1 - (scrollView.contentOffset.y / 100); scale = (scale >= 1) ? scale : 1; scale = (scale <= 2) ? scale : 2; imageView.transform = CGAffineTransformMakeScale(scale, scale);}

圖片無限輪播


原理解析:

在已知圖片數組有N個元素前提下,在UIScrollView中創建N+2個UIImageView,其中第1個至第N個圖片為真實內容,第0個與第N個一樣,第N+1個與第1個一樣,通過-scrollViewDidScroll:代理方法跟蹤contentOffset的的變化,在滑動到首尾兩個圖片處直接設置contentOffset到真實圖片處即可

總結

以上就是這篇文章的全部內容了,希望本文的內容對各位iOS開發者們能有所幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产网站地址| 欧美性猛交xxxx免费看| 欧美黑人巨大精品一区二区| 日韩av在线网页| 26uuu亚洲国产精品| 国产精品久久久久久久av大片| 欧美日韩国产成人| 亚洲精品一区中文| 国产精品稀缺呦系列在线| 国产欧美在线观看| 国产精品啪视频| 在线成人激情视频| 亚洲美女喷白浆| 亚洲а∨天堂久久精品喷水| 亚洲专区中文字幕| 国产视频在线观看一区二区| 亚洲一区中文字幕在线观看| 国产精品流白浆视频| 亚洲男人天堂久| 91精品久久久久久久久不口人| 色在人av网站天堂精品| 九九精品在线视频| 中文字幕日韩精品在线观看| 久久精品99国产精品酒店日本| 中文国产成人精品| 91精品国产综合久久久久久久久| 91精品国产91| 国产盗摄xxxx视频xxx69| 欧美精品精品精品精品免费| 欧美一区二区影院| 亚洲美女免费精品视频在线观看| 国产亚洲aⅴaaaaaa毛片| 欧美电影在线观看高清| 国产精品美女免费| 夜夜嗨av色综合久久久综合网| 久久综合国产精品台湾中文娱乐网| 欧美性生交xxxxx久久久| 久久久久久久久国产精品| 日韩成人中文电影| 97国产精品久久| 日韩大片在线观看视频| 一道本无吗dⅴd在线播放一区| 欧美高清无遮挡| 亚洲аv电影天堂网| 国产激情久久久久| 久久不射电影网| 国产精品入口免费视频一| 这里只有精品丝袜| 91经典在线视频| 亚洲精品永久免费| 亚洲在线视频观看| 精品国产一区二区三区在线观看| 久久久久久av| 日韩视频免费看| 国产精品wwwwww| 亚洲精品女av网站| 久久精品国产亚洲精品2020| 色综合91久久精品中文字幕| 在线播放国产一区二区三区| 亚洲男人天堂手机在线| 久久中文字幕在线视频| 亚洲国产精品悠悠久久琪琪| 日韩av电影中文字幕| 精品久久久久久国产91| 亚洲欧美激情四射在线日| 亚洲成av人乱码色午夜| 国产精品国产自产拍高清av水多| 欧美激情一级欧美精品| 欧美性色视频在线| 欧美午夜性色大片在线观看| 国产午夜精品久久久| 欧美专区第一页| 91色琪琪电影亚洲精品久久| 亚洲自拍av在线| 精品夜色国产国偷在线| 精品国产区一区二区三区在线观看| 久久久久久91| 欧美不卡视频一区发布| 国产亚洲精品高潮| 性色av一区二区三区免费| 欧美小视频在线观看| 亚洲欧洲国产一区| 亚洲影视中文字幕| 日韩中文在线中文网在线观看| 18一19gay欧美视频网站| 久热精品视频在线观看| 日韩精品视频在线观看网址| 68精品国产免费久久久久久婷婷| 欧美一级淫片videoshd| 亚洲性日韩精品一区二区| 8050国产精品久久久久久| 亚洲国产精品99| 国产欧美在线看| 深夜福利一区二区| 国产亚洲精品美女| 欧美成人黑人xx视频免费观看| 午夜精品视频在线| 91成人国产在线观看| 97超级碰碰碰| 日韩欧美国产视频| 国产精品视频男人的天堂| www亚洲欧美| 亚洲精品久久久一区二区三区| 日韩av在线精品| 国产精品视频免费在线| 欧美亚洲成人免费| 欧美理论电影网| 97精品国产aⅴ7777| 一区二区中文字幕| 97视频在线观看视频免费视频| 亚洲欧美日本另类| 精品国产一区二区三区久久| 在线精品高清中文字幕| 亚洲va久久久噜噜噜久久天堂| 韩国视频理论视频久久| 日韩国产精品亚洲а∨天堂免| 色婷婷久久一区二区| 日本高清视频精品| 久久成人精品电影| 日韩精品在线电影| 久久久精品中文字幕| 久久6精品影院| 成人免费网站在线看| 91精品免费久久久久久久久| 中文日韩在线视频| 亚洲第一色在线| 国产日韩欧美夫妻视频在线观看| 欧美亚洲国产另类| 美女扒开尿口让男人操亚洲视频网站| 美日韩精品视频免费看| 91美女片黄在线观看游戏| 亚洲国产精久久久久久久| 成人免费在线网址| 亚洲色图50p| 欧美电影免费观看高清| 久久不射热爱视频精品| 亚洲精品国产精品国自产观看浪潮| 欧美日韩在线观看视频| 成人精品在线视频| 日韩免费观看在线观看| 美日韩在线视频| 亚洲自拍另类欧美丝袜| 97涩涩爰在线观看亚洲| 欧美黑人巨大精品一区二区| 深夜福利国产精品| 亚洲精品一二区| 久久99国产精品自在自在app| 日韩欧美中文第一页| 亚洲国产一区二区三区在线观看| 欧美精品一区三区| 91国在线精品国内播放| 国产日韩精品在线| 久久久久久亚洲| 精品无人区太爽高潮在线播放| 97av视频在线| 欧美www视频在线观看| 国产综合在线观看视频| 欧美日韩日本国产| 国产精品久久久久久av福利| 97在线观看免费高清| 91精品视频免费看| 国产中文欧美精品| 日韩高清电影免费观看完整版| 97免费视频在线|