iOS開發滾動視圖UIScrollView
滾動視圖UIScrollView在滾動過程當中,其實是在修改坐標原點。
當手指觸摸 后,ScrollView會暫時攔截觸摸事件,并開啟一個計時器。假如在計時器到點后沒有發生手指移動事件,那么ScrollView發送、 tracking events到被點擊的subview;假如在計時器到點前發生了移動事件,那么ScrollView取消tracking,自己發生滾動。
初始化
- UIScrollView *sv = [[UIScrollView alloc] initWithFrame:CGMakeSize(0.0,0.0,self.view.frame.size.with,600)];
一、深入分析UIScrollView
1、由于移動設備自身的限制,當某些視圖滾出可見范圍時,應該如何處理,如何重用可視的空間,減少內存的開銷。
2、UIScrollView是UITableView和UITextView的超類。它的核心理念:UIScrollView 是一個可以在內容視圖之上調整自己原點坐標的視圖。它根據自身框架的大小,裁剪視圖中的內容。通常框架是和應用程序窗口一樣大。可以根據手指的移動,調整 原點的位置,這個原點位置就是滾動視圖的偏移量。展示內容的視圖會根據滾動視圖的原點位置,開始繪制視圖的內容。UIScrollView必須知道內容視圖的大小,以便于知道什么時候停止,一般當滾動出內容的邊界時,它就返回了。
UIScrollView必須知道一個觸摸信號是打算滾動還是打算跟蹤里面的子視圖。為了達到這個目的,它臨時中斷了一個touch-down事件,通過建立一個定時器,在定時器開始行動之前,看是否觸摸的手指做了任何的移動。假如定時器運行中沒有任何的大的位置改變,UIScrollView就發送一個跟蹤事件給觸摸的子視圖;如果在定時器消失前,用戶拖動手指足夠遠,UIScrollView就取消子視圖的任何跟蹤事件,而滾動它自己。
子類可以通過重載touchesShouldBegin:withEvent:inContentView:、pagingEnabled和touchesShouldCancelInContentView:方法,從而影響滾動視圖的滾動手勢。
UIScrollView 類有一個delegate,需要適配的協議是UIScrollViewDelegate。為了縮放和平鋪工作,代理必須實現 viewForZoomingInScrollView:和scrollViewDidEndZooming:withView:atScale:方法。
在UIScrollView對象中,不應該嵌入任何UIWebView和UITableView,否則會出現一些異常情況,因為兩個對象的觸摸事件可能被混合,從而被錯誤的處理。
二、UIScrollView簡單使用
1、拖動一個UIScrollView控件到IB,在上面添加6個標簽。設置第六個標簽在可見范圍外,可以直接設置坐標值。如下圖所示:
2、將UIScrollView添加輸出口,設置為theScroller,其它保留默認。
3、支持滾動
為給可滾動視圖添加滾動功能,需要將屬性contentSize設置為一個CGSize值。CGSize是一個簡單的C語言數據結構,它包含高度和寬度,可使用函數CGSize(<with>,<height>)創建一個這樣的對象。
例如要告訴該可滾動視圖(theScroller)可水平和垂直分別滾動到280點和600點,可在viewDidLoad方法中編寫如下代碼:
- self.theScroller.contentSize = CGSizeMake(280.0,600.0);
注:我在測試的時候,沒有添加該行代碼,但是運行的時候仍能滾動。。。
補充:
原來開始我認為的滾動,只是bounces(橡皮筋)屬性和IOS 6新增的AutoLayout屬性的作用,設置了AutoLayout,而bounces屬性默認是true的,當我按住鍵盤不放,往下滾動的時候,確實可以看到第六個標簽。
所以真正要讓ScrollView能夠滾動,還是需要去設置contentSize的。
4、運行效果
希望通過本文的簡單介紹,讀者朋友們對iOS開發中滾動視圖UIScrollView有了一個清晰的認識和理解。