UIScrollView原理(轉載)

UIScrollView原理(http://blog.sina.com.cn/s/blog_85c1f6a50100xihg.html)
 

在滾動過程中,實際上是在修改原點座標

當手指觸摸後, scroll view會暫時攔截觸摸事件,使用一個計時器,假如在計時器到點後,沒有發生手指移動事件,那麼,scroll view發送tracking events到被點擊的subview(此時劃不動)
假如在計時器到點前,發生了移動事件,那麼 scroll view 取消tracking本身發生滾動(能夠滾動)

子類能夠重載touchesShouldBegin:withEvent:inContentView: 決定本身是否接收touch事件
pagingEnabled當值是YES,會自動滾動到subview的邊界,默認是NO
touchesShouldCancelInContentView: 開始發送tracking messages消息給subview的時候
調用這個方法,決定是否發送tracking messages消息到subview,假如返回NO,發送,YES則不發送
假如 canCancelContentTouches屬性是NO,則不調用這個方法
來影響如何處理滾動手勢

scroll view還處理縮放和平移手勢html

要實現縮放和平移,必須實現委託viewForZoomingInScrollView:算法

scrollViewDidEndZooming:withView:atScale:.net

兩個方法,另外 maximumZoomScale和minimumZoomScale兩個屬性要不同 

幾個屬性
tracking  當touch後尚未拖動的時候,值是YES,不然NOhtm

zoomBouncing  當內容放大到最大或者最小的時候,值是YES,不然NOblog

zooming  當正在縮放的時候,值是YES,不然NO繼承

decelerating  當滾動後,手指放開,可是還在繼續滾動中,這個時候是 YES,其餘是NO事件

decelerationRate  設置手指放開後的減速率圖片

maximumZoomScale  一個浮點數,表示能放最大的倍數ci

minimumZoomScale   一個浮點數,表示能縮最小的倍數it

pagingEnabled  當值是YES,會自動滾動到subview的邊界,默認是NO

scrollEnabled  決定是否能夠滾動

delaysContentTouches

是 個布爾值,當值是YES的時候,用戶觸碰開始,scroll view要延遲一會,看看是否用戶有意圖滾動,假如滾動了,那麼捕捉touch-down事件,不然就不捕捉, 假如值是NO,當用戶觸碰, scroll view會當即觸發touchesShouldBegin:withEvent:inContentView:, 默認是YES

canCancelContentTouches
當 值是YES的時候,用戶觸碰後,而後在必定時間內沒有移動,scrollView發送tracking events,而後用戶移動手指足夠長度觸發滾動事件,這個時候,scrollView發送了touchesCancelled:withEvent: 到subview,而後scroView開始滾動
假如值是NO,scrollView發送tracking events後,就算用戶移動手指,scrollView也不會滾動
 
contentSize 裏面內容的大小,也就是能夠滾動的大小,默認是0,沒有滾動效果。
 
showsHorizontalScrollIndicator 滾動時,是否顯示水平滾動條
 
showsVerticalScrollIndicator 滾動時,是否顯示垂直滾動條
 
bounces  默認是yes,就是滾動超過邊界,會反彈有反彈回來的效果,假如是 NO,那麼滾動到達邊界,那麼會連忙中止
 
bouncesZoom  和bounces相似,區別在於,這個效果反映在縮放上面,假如縮放超過最大縮放,那麼會反彈效果,假如是NO,則到達最大或者最小的時候,當即中止
 
directionalLockEnabled  默認是NO, 能夠在垂直和水平方向同時運動, 當值是YES, 假如一開始是垂直或者是水平運動,那麼接下來會鎖定另一個方向的滾動, 假如一開始是對角方向滾動,則不會禁止某個方向
 
indicatorStyle  滾動條的樣式,基本只是設置顏色,總共3個顏色,默認,黑色的,白色的
 
scrollIndicatorInsets  設置滾動條的位置
http://blog.csdn.net/diyagoanyhacker/article/details/6062498

eg:
UIScrollView *sv  =[[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0,self.view.frame.size.width, 400)];

UIScrollView的最大屬性就是能夠滾動,那種效果很好看,其實滾動的效果主要的原理是修改他的座標,準確的講是修改原點座標,而 UIScrollView跟其餘組件的都同樣,有本身的delegate,在.h文件中要繼承UIScrollView的delegate而後在.m文件 的viewDidLoad設置的delegate爲self。以下:

view plain

sv.pagingEnabled = YES; 

sv.backgroundColor = [UIColor blueColor]; 

sv.showsVerticalScrollIndicator = NO; 

sv.showsHorizontalScrollIndicator = NO; 

sv.delegate = self; 

CGSize newSize = CGSizeMake(self.view.frame.size.width * 2, self.view.frame.size.height); 

[sv setContentSize:newSize]; 

[self.view addSubview: sv]; 

在上面的代碼中,必定要設置UIScrollView的pagingEnable爲YES。否則你就是設置好了其餘屬性,它仍是沒法拖動,接下去的分別是 設置背景顏色和是否顯示水平和豎直拖動條,最後最重要的設置他的ContentSize,ContentSize的意思就是它全部內容的大小,這個和它的 Frame是不同的,只有ContentSize的大小大於Frame這樣才能夠支持拖動。

(3)結合UIPageControl作新聞翻頁效果

初始化UIPageControl的方法都很簡單,就是上面講的alloc和init,不過你們要記住的一點就是若是你定義了全局變量必定要在delloc那裏釋放掉。

UIPageControl有一個userInteractionEnabled你能夠設置它爲NO。就是點擊的時候它不調用任何方法。而後設置它的currentPage 爲0,並把它加到view上去。

接下來在UIScrollView的delegate方法:

view plain

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;   

在這裏你能夠寫上關於UIPageControl的頁面設置的算法。以下

view plain

int index = fabs(scrollView.contentOffset.x) /scrollView.frame.size.width; 

pageControl.currentPage = index; 

(4)其餘的

UIScrollView還支持處理縮放的動做,好比圖片的縮小或者地圖。

可是必須實現它的委託viewForZoomingInScrollView:

scrollViewDidEndZooming:withView:atScale:而後它的兩個屬性maximumZoomScale和minimumZoomScale 要不同。這樣就能基本實現圖片的縮放了。

相關文章
相關標籤/搜索