2

カスタムdrawRectメソッド(およびコアグラフィックス)の実装はまったく初めてですが、UITableViewのスクロールパフォーマンスを向上させるために実装しています私が愚かなことをしているなら、私に知らせてください。

私のセルにはUIImageがあり、その下部に画像のキャプションを印刷したいと思います。ただし、画像に関係なくキャプションテキストがはっきりと表示されるようにするには、UIImageの上とキャプションテキストの下に不透明度が約75%の黒い長方形を作成します。

私は以下を試しました

[self.picture drawAtPoint:point];

[[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.75] setFill];
UIRectFill(CGRectMake(rect));

しかし、その結果の塗りつぶしは実際にはUIImageに食い込み(申し訳ありませんが、説明が不十分です)、わずかに透明な塗りつぶしの下に表示されている部分は、UITableViewの背景です...

長方形の別の画像を作成して、その上に描画することもできたと思いますが、代わりにこれself.pictureを使用する方が簡単な方法かどうか疑問に思っていUIRectFillます...

前述のように、私はCore Graphicsをまったく使用していないので、ヒントをいただければ幸いです。前もって感謝します!


また、2番目の質問があります...ダウンロードされた画像の寸法(ピクセル単位)は、網膜表示を考慮して、画像が収まる長方形(点単位)の2倍です。ただし、現在、iPhone4デバイスでも、現在その範囲を超えています...どうすれば修正できますか(iPhone4以前のデバイスも含む)。

4

2 に答える 2

2

私はカスタム作業をあまり行わないdrawRectので、質問のその部分を他の人に任せますが、通常、テーブルビューのパフォーマンスの問題は、高価な計算をバックグラウンドキューに移動し、メインからセルを非同期に更新することで、はるかに簡単に解決されますそのバックグラウンド操作が実行されたときにキューに入れます。したがって、次のようなものです。

まず、テーブルビューの操作キュープロパティを定義します。

@property (nonatomic, strong) NSOperationQueue *queue;

次に、でviewDidLoad、これを初期化します。

self.queue = [[NSOperationQueue alloc] init];
self.queue.maxConcurrentOperationQueue = 4;

そして、ではcellForRowAtIndexPath、次のことができます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MyCellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Do the quick, computationally inexpensive stuff first, stuff here.
    // Examples might include setting the labels adding/setting various controls
    // using any images that you might already have cached, clearing any of the
    // image stuff you might be recalculating in the background queue in case you're
    // dealing with a dequeued cell, etc.

    // Now send the slower stuff to the background queue.

    [self.queue addOperationWithBlock:^{

        // Do the slower stuff (like complex image processing) here.
        // If you're doing caching, update the cache here, too.

        // When done with the slow stuff, send the UI update back
        // to the main queue...

        [[NSOperationQueue mainQueue] addOperationWithBlock:^{

            // see if the cell is still visible, and if so ...

            UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
            if (cell)
            {
                // now update the UI back in the main queue
            }
        }];

    }];

    return cell;
}

計算コストの高いものの結果を、のようなものにNSCache、そしておそらくDocuments他の場所にもキャッシュすることで、これをさらに最適化できます。したがって、複雑なものを実行する必要がある頻度を最適化し、実際に最適化することができます。 UI。

ちなみに、これを行うと、UILabel(アルファが0.75の黒にbackgroundColor使用して)を上に置くことができ、iOSが自動的に処理します。それが得るのと同じくらい簡単です。UIColorUIImageView

画像の解像度に関する最後の質問では、次のいずれかを行うことができます。

  • ビューcontentScaleFactorを使用して、網膜を扱っているかどうかを判断し、それに応じてサムネイル画像のサイズを変更します。また
  • imageviewを使用するだけcontentModeUIViewContentModeScaleAspectFill、サムネイル画像が正しくレンダリングされるようになります...小さなサムネイル画像(2倍の画像でも)を使用している場合、パフォーマンスは一般的に良好です。
于 2012-10-10T19:03:45.340 に答える
0

これは、別のスタックオーバーフローの質問kCGBlendModeNormalごとに、オプションを使用してそれを行う正しい方法です

[[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.75] setFill];
UIRectFillUsingBlendMode(rect, kCGBlendModeNormal);
于 2012-10-15T03:26:33.583 に答える