2013-06-20 29 views
19

我在我的應用程序中有一個全屏UICollectionView。它水平滾動,每個單元格填充集合視圖的邊界。收集視圖由UIViewController管理。UICollectionView內的UIViewController

由於每「頁」是相當複雜的,它是有道理的每個頁面本身由相關UIViewController進行管理。的iOS 5具有用於視圖控制器包容支持,這樣孩子控制器應該得到適當的生命週期方法(例如viewWillAppear:等)時,視圖附接和拆卸。視圖回收可以很好地發揮作用嗎?

滾動從頁面「1」,「2」,新的視圖將被創建(如既可以在同一時間向下觸摸期間在屏幕上)。從頁面「2」移動到「3」,UICollectionView可以成功將頁面「1」的視圖出列,但現在會發生什麼?我會強制將視圖插入視圖控制器三中嗎?

id cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ident" forIndexPath:indexPath]; 
UIViewController *child_controller = [self controllerAtIndexPath:indexPath]; 
[child_controller setView:cell]; 
// ... and so on 

這種感覺不對。但是,我無法想到在這種情況下正確重用視圖的正確方法。我完全採用錯誤的方法嗎?

+8

如果每個單元格填充集合視圖的邊界,爲什麼不直接使用'UIPageViewController'其'transitionStyle'設置爲'UIPageViewControllerTransitionStyleScroll'?它旨在爲每個頁面託管一個子視圖控制器。 –

回答

8

我不認爲UICollectionView是最好的選擇你的任務。
rob mayoff說:你可以使用UIPageViewController
另一種選擇可以是使用UIScrollView用3子視圖(前,電流,下一個)。並且您將可以輕鬆管理其位置和滾動視圖偏移量以達到您想要的效果。
這在2011年WWDC 'Advanced Scrollview Techniques'進行說明。你可以從那裏獲取源代碼。

+0

我完全同意謝爾蓋:這個任務是UIPageViewController創建的。 – MrTJ

+0

@Sergey Kuryanov,我處於同樣的情況,但面對UIPageViewController中的內存問題,任何幫助,您可以提供解決內存問題。我正在使用arc – DAMM108

+0

也許你正試圖同時節省太多的VC。沒有實際的代碼很難發現問題。 –

7

我已經做了同樣的事情,但同時可見兩個視點控制器,並重新排序的,所以收集的觀點是正確的選擇。

原來,刪除以前的視圖控制器的觀點,並添加一個新的造成了相當的滾動性能命中,以去除是最慢的方法的視圖。

細胞的重複使用只有在細胞的新用途相似但不同時纔有意義 - 例如,您正在更改標籤的文字或在圖像視圖中放置不同的圖像。如果你正在剝離並替換整個視圖層次結構,那麼你並沒有真正重用這個單元格。

我最終做的是爲每個可以包含的視圖控制器使用新的單元格。在我的情況下,單元數量有限制,這意味着在同時使用許多視圖控制器的情況下,內存消耗並沒有真正的問題。

所以,簡而言之 - 不要重複使用單元格。這比保留舊的更昂貴。向下滾動一百行表與在幾個全屏視圖中滾動不同。但是,鑑於你的屏幕是全屏的,滾動視圖可能是更好的選擇。

+0

我現在正在做同樣的事情(其他vc的可見邊緣,應用商店搜索結果)。你遇到的任何其他問題或指針? –

+1

我發現唯一有用的是讓所有的子視圖控制器都採用一個協議,它允許集合視圖的控制器告訴它們何時在屏幕上移動和移動 - 並且在那裏,您將執行viewDidAppear /消失的東西,否則不會被調用,因爲視圖只出現一次。 – jrturton

+0

很高興知道。謝謝。 –

7

它可能會更好使用UIView的子類(或子類UICollectionViewCell),而不是封裝UIViewControllers。封裝的UIViewControllers必須知道他們的父視圖控制器,這可能會導致代碼可維護性問題。

複雜性並不意味着你應該考慮採用UIViewController。 UIViews也可能相當複雜。 UIViewController的作用是提供額外的封裝和生命週期,這聽起來並不像你需要的。

至於其他的都表示,UIPageViewController似乎是一個很好的選擇太多,但我不知道你的情況的具體細節。

相關問題