2011-02-06 60 views
21

使用UITableView時,我們可以使用[[ UITableViewCell alloc] initWithStyle: reuseIdentifier:][uiTableViewInstance dequeueReusableCellWithIdentifier:]方法重用其單元格。這有助於保持內存檢查巨大的表格,因爲在給定時刻只有少數單元存在於視圖中。如何重用/回收像uitableviewcell自定義元素呢?

我想創建一個UIScrollView,它有許多子視圖。插入所有的子視圖佔用大量的內存和我想避免的初始時間。 Apple API是否提供了重用這些自定義組件(UIView或其子類)的方法,就像使用標識符的單元視圖一樣?

如果沒有API,我會創建一個,但對此有疑問。例如,對於每個新的子視圖,我都會在前面的視圖之後設置其框架位置。如何在回收時更新每個子視圖的框架?我應該刪除並重新加載每個子視圖的內容,因爲它被回收?我是否應該在另一個線程中執行所有這些計算以避免生成滾動?總而言之,我想要像UITableView那樣使用所有重用內容的平滑滾動體驗。

這裏是一個代碼示例,我至今寫:

int numberOfPages = 0; 
int pageWidth = 100; 
int pageHeight = 100 

UIScrollView *myScrollView = //allocate and initialize a scrollview 
//set its size to 100 by 100 (width equal to pageWidth) 
//set paging enabled for myScrollView 

從方法添加子視圖它,那會被多次調用

- (void) appendSubViewToScrollView { 
    UIView *view = //allocate and initialize a view and dump data in it. 

    CGRect rect = view.frame; 
    rect.size.height = pageHeight; 
    rect.size.width = pageWidth; 
    rect.origin = CGPointMake(pageHeight * numberOfPages, 0); 
    view.frame = rect; 

    [myScrollView addSubview:view]; 

    numberOfPages++; 

    [scrollView setContentSize:CGSizeMake(pageHeight * numberOfPages, pageWidth)]; 

    [view release]; 
} 

編輯:
一些見解進入tableview和它的單元格如何實現這個幕後會很有用。

回答

19

是的,您應該每次都恢復每個子視圖內容,完全如同在表格視圖中一樣。回收子視圖的好處是可以節省視圖存儲的內存,並節省視圖分配的時間,但內容數據管理當然是由您決定的。

所以標準的回收方法要求你使用多個小區的這等於同時在屏幕+額外的細胞開始滾動時,你可能會得到數視圖中顯示的號碼。 比方說,您一次顯示5個完整視圖(滾動視圖穩定),然後在滾動時需要一個額外的視圖,因此最後需要5 + 1 = 6個視圖。這在理論上,建議使用另外2個視圖。 所以你需要編寫兩個池:一個叫做「visibleViews」,它由作爲子視圖添加到scrollview中的所有視圖組成,另一個叫做「availableViews」,由所有視圖組成,可用於重用。 然後你創建所有這些視圖並將它們添加到滾動視圖中(是的:你需要根據它們在滾動視圖中的位置調整它們的框架,是的,你需要再次設置內容)。 最後,您需要通過設置委託來跟蹤滾動視圖移動。此跟蹤的目的是計算哪些可見視圖不可見,然後將其從可見池中移除並移至可用池。除了代理必須瞭解何時出現一個新的單元格,但它仍然不可見,那麼從可用池中獲取它(或者如果池爲空,則alloc/init),並添加到可見池和子視圖中滾動視圖。 當然,如果您想提高性能,您可以在滾動視圖中放置更多子視圖,以避免在單元格開始出現在屏幕上時精確移動單元格,這就是爲什麼我建議在滾動條的兩側使用多個額外視圖視圖。

關於iOS中滾動視圖的使用,WWDC 2010有一個偉大的視頻(如果您是註冊開發者,您可以訪問它):它解釋了這種技術。

XCode文檔中Apple的PhotoScroller示例代碼基本上實現了WWDC視頻中所述的內容並解釋了此技術。

+0

感謝您的回覆Viggio。有沒有與此相關的一些代碼?我可以使用一些參考。是的,我是註冊開發者。你能指出這個案例的相關視頻嗎? (「應用程序框架」?我會休閒地看休息)。我也會下載示例代碼。看起來有趣和有用。 – Sailesh 2011-02-06 17:03:35