1、UIScrollView控件是甚麼?
(1)挪動裝備的屏幕⼤年夜⼩小是極端無限的,是以直接展⽰示在⽤用戶面前的內容也相當無限
(2)當展⽰示的內容較多,超越⼀一個屏幕時,⽤用戶可經由過程轉動⼿手勢來檢查屏幕之外的內容
(3)通俗的UIView不具有轉動功效,不克不及顯⽰示過量的內容
(4)UIScrollView是一個可以或許轉動的視圖控件,可以⽤用來展⽰示⼤年夜量的內容,而且可以經由過程滾 動檢查一切的內容
(5) 舉例:手機上的“設置”、其他⽰示例法式
2、UIScrollView的簡略應用
(1)將須要展⽰的內容添加到UIScrollView中
(2)設置UIScrollView的contentSize屬性,告知UIScrollView一切內容的尺⼨寸,也就是告知 它轉動的規模(能滾多遠,滾到哪⾥裡是止境)
注: 本文中所說的"內容視圖"在官方文檔中稱作"content view",表現UIScrollView中可以用來展現內容的部門
3、屬性與辦法
內容視圖相干
// 內容視圖的年夜小,默許為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的的變更,當不知足懸停前提時,待懸停控件屬於UIScrollView的子視圖,當知足懸停前提時,待懸停控件屬於UIScrollView的父視圖的子視圖
// 以"方法二"為例 - (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 = CGAff.netransformMakeScale(scale, scale); }
圖片無窮輪播
道理解析:
在已知圖片數組有N個元素條件下,在UIScrollView中創立N+2個UIImageView,個中第1個至第N個圖片為真實內容,第0個與第N個一樣,第N+1個與第1個一樣,經由過程-scrollViewDidScroll:
署理辦法跟蹤contentOffset的的變更,在滑動到首尾兩個圖片處直接設置contentOffset到真實圖片處便可
總結
以上就是這篇文章的全體內容了,願望本文的內容對列位IOS開辟者們能有所贊助,假如有疑問年夜家可以留言交換。
【iOS開辟之UIScrollView控件詳解】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!