2

使用:

  • iOS 5、ARC、StoryBoards。

すべてのセルに1つの画像とテキストを配置します。スクロール中に画像のサイズが変更されません。画像の2つのバージョンimage.pngとimage@2x.pngがあります。

カスタムセルは、ストーリーボードのUIImageViewとUILabelにドラッグすることで管理されました。

コード:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
Continent *continent=[self.items objectAtIndex:[indexPath row]];
ContinentCell *cell = (ContinentCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell.continentName.text=continent.continentName;
    cell.textView.text=continent.countriesHash;
    cell.imageView.image=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:continent.continentImage ofType:@"png"]];
 return cell;
}

悪はどこにありますか?前もって感謝します。

4

4 に答える 4

12
[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:continent.continentImage ofType:@"png"]];

高いです。画像をバックグラウンドで非同期にロードし、準備ができたらメインスレッドに表示します。

これが非常に大まかな解決策です

    cell.imageView.image = nil;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      UIImage * img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:continent.continentImage ofType:@"png"]];
      dispatch_sync(dispatch_get_main_queue(), ^{
        cell.imageView.image = img;
      });
    });
于 2012-06-28T18:04:28.560 に答える
5

アプリの磨き方をご覧ください:26:48からのWWDC2011の応答性とパフォーマンスを向上させるためのヒントとコツ。彼らはあなたが直面している問題について正確に話し合っています。お見逃しなく、それは本当に役に立ちます..!

于 2012-06-29T03:34:21.797 に答える
2
- (UITableViewCell *)tableView:(UITableView *)tableView 
                                 cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    Continent *continent=[self.items objectAtIndex:[indexPath row]];
    ContinentCell *cell = (ContinentCell*)[tableView 
                               dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[ContinentCell alloc] 
                               initWithStyle:UITableViewCellStyleDefault 
                               reuseIdentifier:CellIdentifier];
     }
    cell.continentName.text=continent.continentName;
    cell.textView.text=continent.countriesHash;
    //cell.imageView.image=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
                        pathForResource:continent.continentImage ofType:@"png"]];
    cell.imageView.image = [UIImage cachedImage:continent.continentImage];
    return cell;
}

imageWithContentsOfFileの代わりにimageNamedを使用することをお勧めします。

imageNamedメソッドは画像をキャッシュにロードし、次回はキャッシュからロードします。一方、imageWithContentsOfFileメソッドは、キャッシュせずに指定されたパスから画像をロードしNO、メモリ内に複数のコピーを作成します。

独自の画像キャッシュ方式を作成できます。NSMutableDictionary*imagedCacheDictを宣言するだけです

メモリが不足した場合は、 [imagedCacheDictremoveAllObjects]ですべてのオブジェクトを削除できます

 - (UIImage*)cachedImage:(NSString*)fileName
{
   UIImage *cacheImage = [imagedCacheDict objectForKey:fileName];

   if (nil == cacheImage)
   {
      NSString *cacheImageFile = [NSString stringWithFormat:@"%@.png", 
                                   [[NSBundle mainBundle] resourcePath], fileName];
      cacheImage = [UIImage imageWithContentsOfFile:cacheImageFile];
      [imagedCacheDict setObject:cacheImage forKey:fileName];
   }
   return cacheImage;
}

したがって、imageNamedメソッドは絶対に使用しないでください。大量のメモリを消費することにより、アプリケーションが起動します。

于 2012-06-28T18:16:10.677 に答える
2

画像が大きくないことを確認してから、次のようにします。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    Continent *continent=[self.items objectAtIndex:[indexPath row]];
    ContinentCell *cell = (ContinentCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil) cell = [[ContinentCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]
    cell.continentName.text = continent.continentName;
    cell.textView.text = continent.countriesHash;
    cell.imageView.image = [UIImage imageNamed:continent.continentImage];
    return cell;
}

私は2つの重要な変更を加えました:

  1. if(cell == nil) [[ContinentCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]セルを初期化するためのコードが見つからなかったため、追加されました( -registerNibNDAの下にあるため、他のスーパーセクテット関数を使用している場合を除きます)。

  2. メインバンドルから画像をロードし、画像が大きくない場合はキャッシュするため、imageWithContentsOfFile:...シンプルに置き換えられました。これにより、画像の読み込みが速くなります。(そして-imageNamedはファイル拡張子を必要としません)imageNamed-imageNamed

于 2012-06-28T18:10:50.857 に答える