你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開辟之UIScrollView控件詳解

iOS開辟之UIScrollView控件詳解

編輯:IOS開發綜合

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控件詳解】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved