轉自:
http://blog.csdn.net/ch_soft/article/details/6947695/
UIScrollView 原理詳解
ScrollView
UIScrollView
UIScrollView爲了顯示多於一個屏幕的內容或者超過你能放在內存中的內容。
Scroll View爲你處理縮小放大手勢,UIScrollView實現了這些手勢,並且替你處理對於它們的探測和迴應。其中需要注意的子類是UITableView以及UITextView(用來顯示大量的文字)。還有一個UIWebView,儘管那不是UIScrollView的直接子類,它適用UIScrollView去顯示網頁內容
contentsize是內容的寬和高,contentsize.width是內容的寬度,contentsize.heght是高度,contentsize是UIScrollView的一個屬性,它是一個CGSize,是由核心圖形所定義的架構,那定義了你可以滾軸內容的寬度和高度,你也可以添加可以上下滾動的額外區域。第一種方法是你可以通過添加內容的大小來完成。另外一個比較動態的選擇是UIScrollView的另一個屬性contentInset,contentInset增加你在contentsize中指定的內容能夠滾動的上下左右區域數量contentInset.top以及contentInset.buttom分別表示上面和下面的距離。
在滾軸視圖中,有一個叫做ContentOffset的屬性跟蹤UIScrollView的具體位置,你能夠自己獲取和設置它,ContentOffset是你當前可視內容在滾軸視圖邊界的左上角那個點。如圖:
可以看出,ContentOffset內容中的那個點不是從contentInset的左上角開始的,而是內容的左上角,此時的ContentOffset是正值,但有時也是負值,如下圖所示:
使用一個ScrollView
創建一個UIScrollView
CGRectframe = CGRectMake( 0, 0, 200, 200);
scrollView= [[UIScrollView alloc] initWithFrame: frame];
添加子視圖(框架可以超過scroll view的邊界)
frame= CGRectMake( 0, 0, 500, 500);
myImageView= [[UIImageView alloc] initWithFrame: frame];
[scrollViewaddSubview:myImageView];
設置內容尺寸
scrollView.contentSize= CGSize(500,500);
擴展Scroll View 的行爲
應用程序通常需要知道有關的滾圖的事件
scrolloffset改變的時候
拖動開始和結束
減速的開始和結束
通過子類化擴展Scroll View 的行爲
創建一個子類
重寫一些功能並改變行爲
關於這種方式的爭議
應用程序的邏輯和行爲變成了視圖本身的一部分,就像,你可能有一些定製的滾軸邏輯,,在那你只在意一個視圖控制,但你想在不同地方重複使用你的滾軸視圖,如果你必須爲每個都子類化,你最後會有很多不同的滾軸視圖子類以及在視圖中的特定應用邏輯。
編寫很多子類是很沉悶的事情,你最後會有很多無法重複使用的單獨視圖,而MVC的視圖部分的一個重點是視圖是可以在不同的控制器和不同的模式之中重複使用的,如果我們把所有邏輯都放在視圖中,它減少了可複用性。
你的代碼變得很牢固地配對在一起,它實際上變成了超類的一部分,你無法從UIScrollView中析取它,之後用其它東西代替,如果它在你控制器中且爲控制器的一部分,在之後更容易改變它工作的方式和重新安排你應用程序的一些部分。
通過委派來擴展Scroll View 的行爲(常用的)
委派是一個單獨的對象,協議,定義了委派會實現的一系列功能的Objective-C協議,它創建了一系列很清晰的撤銷點,在那裏你能定製行爲和外觀。它在這些對象之間保持了鬆散的配對,視圖本身與視圖控制器或任何其它的控制器對象,委派不是滾軸視圖的直接子類,它比起牢固配對的子類更加的鬆散。