1

本のリストを表示するtableViewがあり、各テーブルセルには「本の名前」と「本の説明」が含まれています。セルの高さは本の説明の長さによって決まるため、セルの高さは異なります。

すべてのセルには背景画像もあり、もちろんセルの高さに応じてスターチされます。

次のように、セル drawRect に背景画像を描画しています。

- (void)drawRect:(CGRect)rect
{
    UIImage *bgImage = [UIImage imageNamed:@"cell_BG.png"];
    bgImage = [bgImage stretchableImageWithLeftCapWidth:60.0 topCapHeight:60.0];
    [bgImage drawInRect:rect];
} 

このコードは機能します。問題はスクロールのパフォーマンスです。私が望むほどスムーズではありません。
主な問題は高さの変化であることに気付きました。これにより、再利用可能なセルを含むすべてのセルに対して drawRect 呼び出しがトリガーされるようです。
(すべてのセルに同じ高さを設定しようとすると、スクロールのパフォーマンスが大幅に向上しましたが、動的な高さを使用する必要があります...)

テーブルのスクロールが改善されるように、これを行うためのより良いアプローチはありますか?

4

1 に答える 1

1

UITableViewCelldrawRect はかなり高価なので、おそらく のビューに対して drawRect をオーバーライドしたくないでしょう。

UIImageViewプロトタイプ セルの上に を配置して、そのイメージを設定してみてください(プログラムで行うか、インターフェイス ビルダーにドラッグするだけです)。次に、画像ビューのフレーム サイズを、それぞれの の動的な高さに一致するように設定できますUITableViewCellUIImageView画像用に最適化されているため、このアプローチはよりスムーズに実行されます。

you の cellforRowAtIndexPath メソッドで imageView の画像とフレーム サイズを設定できますUITableViewController

更新:おそらく、コンテンツ モードを設定して、画像に合わせて拡大縮小することもできます。

UIView クラス リファレンスから: 「contentMode - ビューのフレームではなく、ビューのコンテンツのレイアウト動作を提供します。このプロパティは、ビューに合わせてコンテンツをスケーリングする方法と、キャッシュするか再描画するかにも影響します。」

たとえば、ビューのフレームが変更されるたびに redraw は drawRect を呼び出します。

プログラムで設定できます。

UIView* view = [[UIView alloc] initWithFrame:CGRectMake...etc];
view.contentMode = UIViewContentModeRedraw; // for example

または、インターフェイス ビルダーでビューを選択し、属性インスペクターでコンテンツ モード属性を設定するだけです。UIContentModeScaleToFit などを探していると思います。また、インターフェイス ビルダーを使用している場合は、サイズ インスペクターで UIImageView のストラットとスプリングを確認してください。

于 2012-06-14T16:07:12.850 に答える