2011-06-30 21 views
0

私はUITableViewを使用して、各テーブルビューのセルに2〜3の画像をサムネイルとして表示しています。私がtableviewでそれを示している画像は、サイズが巨大です。これらの画像をサイズ縮小なしで直接使用している場合、TableViewと他のビューコントローラ間を行き来すると、テーブルビューに画像が失われることがあります。処理のためにスムーズにスクロールしない

私は画像のサイズを縮小するサイズ縮小コードを考えました。以下に示すコードはうまく動作し、以前の問題は修正されました。しかし、サイズ縮小コードは大量のメモリを使用するため、テーブルビューでスムーズなスクロールが失われます。新しいテーブルビューセルが表示されるたびに、特定のテーブルビューセル内のイメージを処理(サイズを縮小)します。

これには簡単な解決策があります。前もって感謝します。画像を縮小の上に

//サイズ縮小コード

CGSize newSize=CGSizeMake(_new_width, _new_height); 
UIGraphicsBeginImageContext(newSize); 
[sd._image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
scene_image_preview.image =newImage; 

答えて

0
- (void)saveImage:(UIImage *)image withName:(NSString *)name { 

      [myArray addObject:name]; 

     //save image 
      NSData *data = UIImageJPEGRepresentation(image, 1.0); 
      NSFileManager *fileManager = [NSFileManager defaultManager]; 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name]; 
      [fileManager createFileAtPath:fullPath contents:data attributes:nil]; 

    } 

    - (UIImage *)loadImage:(NSString *)name { 

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:name];  
      UIImage *res = [UIImage imageWithContentsOfFile:fullPath]; 

      return res; 
    } 

最後に、大きなサイズの画像を同時にロードする解決策を得ました。まず、上記のサイズ縮小コードを使用してイメージのサイズを縮小し、それらのイメージをドキュメントディレクトリに初めて保存した後、saveImageおよびloadImage関数を使用してドキュメントディレクトリから保存したイメージをロードしました。

これを解決するためのすべてのコメントと提案をありがとう。

3

あなたのアプリのドキュメントフォルダにファイルとして結果NEWIMAGEを保存することができます。

NSData *imageData = UIImagePNGRepresentation([UIImage imageWithCGImage:newImage]); 
    CGImageRelease(newImage); 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [NSString stringWithFormat:@"%@/%@%d_%d.png",documentsDirectory, prefix, x, y]; 
    [imageData writeToFile:path atomically:NO]; 
+0

適切な解決方法 - OPからパスコンポーネントを取得する場所をOPに伝えて、この回答の光沢を高めることができます。 – Till

+0

@Till - チップのおかげで、私はコードサンプルを更新しました。 – werner

0

いくつかの可能な選択肢

  • それはメインスレッドを保持していないので、バックグラウンドでサイズ変更を行います。
  • これを実行した後にサイズ変更された画像をキャッシュしてください。最初は遅延があります(これはバックグラウンドで使用すると、スクロールに遅延がないので使用できます)
  • イメージをダウンロードしていますか?その場合は、最初にサムネイルをダウンロードして表示してください。次に、画像が選択されている場合は、サムネイルを全画面に拡大表示してぼんやり見えるようにしてから、フルサイズの画像をバックグラウンドでダウンロードし、読み込んだときに表示します。
  • あなたは画像をダウンロードされませんが、アプリに含まれている、ちょうど同様にサムネイルが含まれており、代わりに
画像を描画
0

それらを表示する場合、通常はtime.iを取り、あなたが画像を配置しようとすることができると思います必要に応じてフレームサイズを指定することによってimageView内に表示されます.iは画像の見た目に違いはありません。

セルにimageviewsを追加し、VEY良い公式の例は、AppleからここにありますImageViewの

2
.... http://developer.apple.com/iphone/library/samplecode/LazyTableImages/index.html私はあなたがそこに適切なアプローチを見つけることだと思います

イメージの数に応じて、クラスのプロパティであるNSMutableDictionaryにすべての縮小イメージを保存することができます。あなたのcellForRowAtIndexPathでその後、あなたのヘッダーで

@property (nonatomic, retain) NSMutableDictionary *sizedImages; 

:つまり

コード

UIImage *sizedImage = [sizedImages objectForKey:[NSNumber numberWithInt:indexPath.row]]; 
//Or you could use the filename as the key 

if (!sizedImage) { 
     sizedImage = [self sizeImage];(your sizing method) 
     [sizedImages setObject:sizedImage forKey:[NSNumber numberWithInt:indexPath.row]]; 
} 
0

これらの2つのリンクが

http://www.fieryrobot.com/blog/2008/10/01/glassy-scrolling-with-uitableview/

非常に便利です

と彼のフォローアップポスト

http://www.fieryrobot.com/blog/2008/10/08/more-glassy-scrolling-with-uitableview/

最初のリンクは、いくつかのベストプラクティスです。第2のリンクは、あなたにとってもっと役に立つでしょう。テーブルビューのセル全体を画像にレンダリングし、その代わりに使用します。これをディスクにキャッシュしてメモリを解放します。&は、アプリケーションの実行間で使用できます。

関連する問題