// 內容視圖的大小,默認爲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;
複製代碼
// 返回是否用戶已經觸碰了內容視圖準備進行滑動(注: 該值被設置爲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;
複製代碼
當用戶在UIScrollView的一個子視圖上按下時,UIScrollView並不知道用戶是想要滑動內容視圖仍是點擊對應子視圖,因此在按下的一瞬間,事件UIEvent從UIApplication傳遞到UIScrollView後,其會先將該事件攔截而不會當即傳遞給對應的子視圖,同時開始一個150ms的倒計時,並監聽用戶接下來的行爲數組
// 最小縮放比例,默認爲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;
複製代碼
當用戶使用兩個手指進行縮放操做時,咱們調整內容視圖的偏移量和縮放比例(注: 用戶兩個手指操做結束後,有可能仍然有一個手指在操做,這時不會將事件傳遞給子視圖)bash
// 隱藏鍵盤模式,默認爲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設置爲整個屏幕的大小ui
系統只在UIScrollView是控制器視圖的第0個子視圖時纔會自動修改contentInset和scrollIndicatorInsets屬性atom
若是不想讓系統自動修改contentInset和scrollIndicatorInsets屬性,能夠設置self.automaticallyAdjustsScrollViewInsets = NO;spa
複製代碼
在懸停位置放置一個與待懸停控件相同的控件,經過-scrollViewDidScroll:代理方法跟蹤contentOffset的的變化,當不知足懸停條件時,將該控件hidden屬性設置爲YES;當知足懸停條件時,將該控件hidden屬性設置爲NO代理
經過-scrollViewDidScroll:代理方法跟蹤contentOffset的的變化,當不知足懸停條件時,待懸停控件屬於UIScrollView的子視圖,當知足懸停條件時,待懸停控件屬於UIScrollView的父視圖的子視圖code
經過-scrollViewDidScroll:代理方法跟蹤contentOffset的的變化,根據contentOffset動態設置圖片的縮放比例orm
在已知圖片數組有N個元素前提下,在UIScrollView中建立N+2個UIImageView,其中第1個至第N個圖片爲真實內容,第0個與第N個同樣,第N+1個與第1個同樣,經過-scrollViewDidScroll:代理方法跟蹤contentOffset的的變化,在滑動到首尾兩個圖片處直接設置contentOffset到真實圖片處便可事件