2013-06-20 14 views
19

私はフルスクリーンUICollectionViewをアプリに持っています。これは水平方向にスクロールし、各セルはコレクションビューの境界線を塗りつぶします。コレクションビューはUIViewControllerによって管理されます。UICollectionView内のUIViewController

各「ページ」は相当に複雑ですが、各ページ自体が関連するUIViewControllerによって管理されていることが理にかなっています。 iOS 5ではビューコントローラの格納がサポートされているため、ビューの着脱時に子コントローラが適切なライフサイクルメソッド(例:viewWillAppear:など)を受け取るようにします。ビューのリサイクルでこれはうまくいくでしょうか?

ページ「1」から「2」にスクロールすると、新しいビューが作成されます(両方が同時にタッチダウン中にオンスクリーンになる可能性があります)。ページ「2」から「3」に移動すると、UICollectionViewはページ「1」のビューをデキューできましたが、今はどうなりますか?私は強制的にView Controller 3にビューを挿入しますか?

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

これは間違っています。しかし、この例では、ビューを正しく再利用する正しい方法を考えることはできません。間違ったアプローチをとっていますか?

+8

各セルがコレクションビューの境界線を埋める場合は、なぜ 'UIPageViewController'を' transitionStyle'を 'UIPageViewControllerTransitionStyleScroll'に設定して使用しないのですか?ページごとに1つの子ビューコントローラをホストするように設計されています。 –

答えて

8

私はUICollectionViewがあなたの仕事に最適な選択だとは思わない。
rob mayoffのように:UIPageViewControllerを使用できます。
もう1つのオプションは、サブビュー3つ(前、現在、次)のUIScrollViewを使用することができます。また、位置やスクロールビューのオフセットを簡単に管理して、必要な効果を得ることができます。
これは、WWDC 2011 'Advanced Scrollview Techniques'に記載されています。そこからソースコードを取得することができます。

+0

私はSergeyに完全に同意します:このタスクはUIPageViewControllerが作成したものです。 – MrTJ

+0

@Sergey Kuryanov、私は同じ状況ですが、UIPageViewControllerのメモリの問題に直面しています。メモリの問題を解決するために役立つヘルプ。 – DAMM108

+0

多すぎるVCを同時に保存しようとしているかもしれません。実際のコードなしで問題を検出するのは難しいです。 –

7

同じことをやったことがありますが、同時に2つのビューコントローラーが表示され、並べ替え可能なので、コレクションビューが適切でした。

以前のビューコントローラのビューを削除して新しいビューコントローラを追加すると、スクロール時にパフォーマンスが大幅に低下し、最も遅い方法であるビューが削除されることが判明しました。

セルの再利用は、セルの新しい使用が似ていても違いがある場合にのみ意味があります。ラベルのテキストを変更したり、別のイメージをイメージビューに入れたりしています。あなたがリッピングしてビュー階層全体を置き換えているのであれば、実際にセルを再利用しているわけではありません。

私がやり遂げたのは、含まれる可能性のあるビューコントローラーごとに新しいセルを使用することでした。私の場合、セルの数には限界がありました。つまり、多くのビューコントローラを一度に使用してメモリ消費量に問題がないということです。

だから、一言で言えば、細胞を再使用しないでください。古いものを守るよりも高価です。 100行の表をスクロールすることは、いくつかのフルスクリーン表示をスクロールすることとは異なります。しかし、あなたがフルスクリーンであることを考えると、スクロールビューがより良い選択肢になるかもしれません。

+0

私は今、まったく同じことをしています(他のVCの目に見える部分、アプリケーションストアの検索結果)。他の問題に遭遇した場合やポインタを使用した場合 –

+1

私が有用だと分かったのは、すべての子ビューコントローラに、コレクションビューのコントローラが画面上を移動しているときと画面外に移動しているときに指示するプロトコルを採用することでした。そして、そこではviewDidAppear /ビューは一度しか出現しなかったので、そうでなければ呼び出されませんでした。 – jrturton

+0

お役立ち情報ありがとう。 –

7

カプセル化されたUIViewControllerではなく、UIViewサブクラス(またはUICollectionViewCellサブクラス)を使用する方がよいでしょう。カプセル化されたUIViewControllerは、親ビューコントローラの知識がなければならず、コードの保守性に問題が発生する可能性があります。

複雑さが自動的にUIViewControllerの採用を検討する必要はありません。 UIViewもかなり複雑になる可能性があります。 UIViewControllerの役割は、実際にはカプセル化とライフサイクルを追加して、ここで必要なようには聞こえないようにすることです。

他にも述べたように、UIPageViewControllerも良い選択肢のようですが、あなたの状況の詳細はわかりません。

関連する問題