1

私の問題に実際には答えない同様のもの

私がしていること

ユーザーが「保存」ボタンをタップします。これにより、新しいテーブル ビュー セルが作成されます。画像は別のスレッドでダウンロードされます。

  • URLから画像をダウンロードする
  • 画像を保存する
  • アスペクト比を維持したまま画像を拡大縮小する
  • 先ほど作成した UITableViewCell imageView に画像を設定します

問題

問題は最後のステップです。画像がビューを埋めて切り取られるようにします。ただし、画像は常に imageView 内に完全に収まるように描画され、空の空白があります。画像は、セルの imageView を 1 つの次元で埋めることさえありません。上下左右の空白で右揃えです。

誤って描画された画像が設定された後にセルをタップすると、セルが再描画され、画像が描画されて imageView が 1 次元で塗りつぶされますが、まだクリップされません。

コード

セルを作成し、一時的な画像を設定します

cell.imageView.image = [UIImage imageNamed:@"125-food.png"];
cell.imageView.contentMode = UIViewContentModeScaleAspectFit;
cell.imageView.layer.masksToBounds=YES;

私はこのように仕事を始めます:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 500000 * NSEC_PER_USEC), dispatch_get_current_queue(), ^{ /*Stuff*/ });

スケール イメージ コード

CGFloat newHeight;
CGFloat newWidth;
if(image.size.width>image.size.height)
{
    newHeight = 44.0;
    newWidth = image.size.width * newHeight / image.size.height;
}
else
{
    newWidth = 44.0;
    newHeight = image.size.height * newWidth / image.size.width;
}

CGRect newRect = CGRectMake(0,0,newWidth,newHeight);
UIGraphicsBeginImageContext(newRect.size);
[image drawInRect:newRect];
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;

そして、セルに newImage を設定します

cell.imageView.image = newImage;

スクリーンショット

細胞のスクリーンショット

新しいセルは 44x44 の画像ビューを埋めず、古いセルは切り取られません。

4

1 に答える 1

0

問題が解決したようです。まず、画像をスケーリングする方法が正しくありませんでした。ここでより良い方法を見つけましたUIImage: Resize, then Crop

Anybodyが提案した方法を使用しました。したがって、倍率を計算することで、正しいスケーリングで正しいサイズの画像を作成できます。これにより、ビューで画像を切り取る必要がなくなります。

CGFloat スケールファクター = 1.0;

//Deciding which factor to use to scale the image (factor = targetSize / imageSize)
if (image.size.width > targetSize.width || image.size.height > targetSize.height)
    if (!((scaleFactor = (targetSize.width / image.size.width)) > (targetSize.height / image.size.height))) //scale to fit width, or
        scaleFactor = targetSize.height / image.size.height; // scale to fit heigth.

UIGraphicsBeginImageContext(targetSize); 

//Creating the rect where the scaled image is drawn in
CGRect rect = CGRectMake((targetSize.width - image.size.width * scaleFactor) / 2,
                         (targetSize.height -  image.size.height * scaleFactor) / 2,
                         image.size.width * scaleFactor, image.size.height * scaleFactor);

//Draw the image into the rect
[image drawInRect:rect];

あとは画像を設定するだけです。UIImageがURLからロードされたときにUITableViewCellでUIImageViewのサイズを設定しますか? 画像を設定できる必要があることを示唆しています。しかし、それは私のスクリーンショットのような結果をもたらしました。どうやら、テーブル セル ビューも制御できません。

UITableViewCell の UIImageView のサイズ変更 では、imageView に変換を設定することを提案しています。サムネイル画像はすでにサイズが決まっているので、1.0 にスケーリングする必要があると思いました。

cell.imageView.transform = CGAffineTransformMakeScale(1.0, 1.0);

そして、これは今のところうまくいっているようです!

一時的なアイコンが機能しているように見え、保存されたサムネイルが正しく表示されます。違いは、一時画像が同じサイズではないことです。そこで、アイコンを正しいサイズに拡大しました。画像が正しく表示されるようになりました。

于 2013-04-30T03:11:27.987 に答える