2011-01-18 11 views
0

、私はカスタムビュー、テーブルビューのようなビットを実装しています。これを行うために、私はNSViewをサブクラス化しました。今私の質問は、どのようなテーブルビューのすべてのセルを描画する最も効率的な方法です。 CALayersのように、NSViewsを使うべきか、それとも別のものを使うべきなのでしょうか?私のプログラムでココア効率的なビュー描画

ありがとうございます!

P .: Mac OS Xのではなく、iOSのです。あなたの質問やコメントに基づいて

+0

このテーブルはどのようなビューに使用されていますか?これは、提案する最適なタイプの最適化を指示するので、あなたの質問の重要な部分です。 –

+0

@ Joshua Nozzi:基本的にはiOSのテーブルビューのようです。カスタムセルなどを使用して... – ryyst

答えて

1

は、私は2つの選択肢を提案:

NSCollectionView/NSCollectionViewItemを - これがあなたの「セル」(プロトタイプビューのインスタンス)のすべてが同じ寸法である場合にのみ有効です。つまり、他のものよりも幅が広い、または背が高い(または狭くても短くても)ことはできません。これはです。効率的でAppKitの準備が整いました。単一の列であってもnの行であっても、それは魅力のように機能します。

ロールオーダー - これは難しいことですが、柔軟性があります。 NSCollectionView/NSCollectionViewItemとよく似ていますが、コンテナとしての役割を果たすビューを持っていて、表示しているさまざまな「アイテム」を描画するために再利用するビューが理想的です。同じビューを使用して表現されたオブジェクトを設定し、それを「スタンプ」して(ポーズして描画する)、コレクション全体を1つのロールでロールオーバーし、選択したもの、アクティブなもの、あなたが持っているアイテム。さらに高速に:再利用可能なアイテムビューで各アイテムのイメージとサイズをロールスルーしてキャッシュし、選択したアイテム以外のすべてのアイテムをキャッシュから描画します(実際の実際のビューを適切な位置に配置し、キャッシュされたその内容が選択されていないときに変更されます)。より速く静止しています:1ライブビューと1 "キャッシング"ビューで、可視の矩形と交差するキャッシュされた画像の計算された矩形だけを描画します(「ライブ」/選択されたビューは表示されません)。注意:水平方向に縮小すると、すべてのアイテムが垂直方向に拡大するため、コンテナのフレームの幅が変更されるたびにキャッシュを再実行する必要があります。可能であれば、NSOperation/NSOperationQueueを利用してバックグラウンドでキャッシュを処理し、すべてのキャッシュされた項目が0〜nnが目に見える矩形と交差する最高の項目である場合)に再表示するためのフラグを立てるだけです。利用可能です。

"item"はさまざまな長さのテキストを持つエントリで、自分のアプリケーションの1つで、後者に非常に近いものを使用します。私は自分のソリューションで言及したすべての戦術を採用していませんが、ほとんどの場合、パフォーマンスの向上は非常に満足です。 :-)

これが役に立ちます。

+0

Woah、答えてくれてありがとう!サイズを変更できるセルを作成したいので、自分のコードをロールバックする必要があります。 – ryyst

+0

「ポーズして描く」方法 – ryyst

+0

NSCollectionView/Itemと同様に、プロトタイプビューには対応するコントローラがあります。そのコントローラには、オブジェクトを表すためにビューの内容を更新する世話をする-representedObjectプロパティがあります。描画したいものごとに、アイテムコントローラの表現されたオブジェクトを設定し、そのビューを更新し、NSViewの-dataWithPDFInsideRect:で画像をキャプチャします(これをプロトタイプビューに対して呼び出します)。このイメージは、コンテナビューの適切な場所に描画するだけでなく、キャッシュするものです。 –

関連する問題