7


9

UITableViewCell画像にUIImageの寸法を設定する

標準の + UITableViewCell +`があり、テキストと画像のプロパティを使用して `+ favicon.ico +`とラベルを表示しています。 `+ UIImage +`はICO形式をサポートしているため、ほとんどの場合、これは非常にうまく機能します。 ただし、一部のサイト(http://www.amazon.com/favicon.ico[Amazon.com]など)には、同じファイルに複数のサイズを保存するICO形式の機能を利用する `+ favicon.ico + sがあります。 Amazonは4種類のサイズを持ち、最大48x48のサイズです。

これは、32 x 32または48 x 48で入ってきて、すべてをひどく見えるようにする少数を除いて、ほとんどの画像が16 x 16であることをもたらします。 私はここ、公式フォーラム、ドキュメンテーション、そして他の場所で検索に成功しましたが成功しませんでした。 私はイメージサイズを制限するために私が考えることができるすべてを試みました。 機能した唯一のものは文書化されていないメソッドですが、これは使用しません。 これは私の最初のアプリとCocoaとの私の最初の経験です(C#から来た)。

私が探しているものが明確ではなかった場合、理想的には、アドバイスは `+ UIImage `の寸法を設定することに焦点を当て、48x48バージョンが16x16に縮小するか、 ` UIImage +`にICOファイルにある16x16バージョンを使用します。 必ずしもコードは必要ありません。アプローチを提案するだけで問題ありません。

誰かが何か提案がありますか? (私は公式フォーラムhttps://devforums.apple.com/message/75874#75874 [まあまあ]で尋ねました、私はすでにこれに1日以上沈めたので。 解決策が掲載されている場合は、ここにも掲載します。)

6 Answer


23


これは公式フォーラム postedで「bcd」を使用したユーザーの問題です。ユーティリティメソッドのセット)

(UIImage *)スケール:(UIImage *)画像toSize:(CGSize)size {UIGraphicsBeginImageContext(size);} [image drawInRect:CGRectMake(0、0、size.width、size.height)]; UIImage * scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); scaledImageを返します。 }


4


私は自分のアプリで似たようなことをしています。

UIImage * resizedImage(UIImage * inImage、CGRect thumbRect){CGImageRef imageRef = [inImage CGImage]; CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef);

if(alphaInfo == kCGImageAlphaNone)alphaInfo = kCGImageAlphaNoneSkipLast。

CGContextRef bitmap = CGBitmapContextCreate(NULL、thumbRect.size.width、thumbRect.size.height、8、thumbRect.size.width * 3、CGColorSpaceCreateDeviceRGB()、alphaInfo);

CGContextDrawImage(bitmap、thumbRect、imageRef);

CGImageRef ref = CGBitmapContextCreateImage(bitmap); UIImage * result = [UIImage imageWithCGImage:ref];

CGContextRelease(ビットマップ); CGImageRelease(ref);

結果を返します。 }

次に、縦横比を制限した新しい画像を作成します。 「image」をAmazonから入手したICOファイルに置き換えます。

CGRect sz = CGRectMake(0.0f、0.0f、16、16); UIImage * resized = resizedImage(image、sz);


1


答えについてコメントするのに十分なカルマをまだ持っていないが、私は上記のbbrandonsコードでうまくいった。

https://stackoverflow.com/questions/2235210/image-resized-error-cgbitmapcontextcreate-unsupported-parameterへの回答を読んだ後 - 私は行あたりのバイト数の設定が十分に高くないということに関してコンソールでかなりの数の警告を得ました/ 2235465#2235465 [post]私はそれを0に設定することになった、それはシステムに正しい値を決定させる。

例えば:

CGContextRef bitmap = CGBitmapContextCreate(NULL、サイズ。幅、サイズ。高さ、8、0、CGColorSpaceCreateDeviceRGB()、alphaInfo);


1


これが私のやり方です。 このテクニックは、テキストと詳細テキストのラベルを適切に左に移動するようにします。

@interface SizableImageCell:UITableViewCell {} @end @implementation SizableImageCell
-  (void)layoutSubviews {[super layoutSubviews];

float desiredWidth = 80; float w = self.imageView.frame.size.width; if(w> desiredWidth){float widthSub = w  -  desiredWidth; self.imageView.frame = CGRectMake(self.imageView.frame.origin.x、self.imageView.frame.origin.y、desiredWidth、self.imageView.frame.size.height); self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x-widthSub、self.textLabel.frame.origin.y、self.textLabel.frame.size.width widthSub、self.textLabel.frame.size.height ; self.detailTextLabel.frame = CGRectMake(self.detailTextLabel.frame.origin.x-widthSub、self.detailTextLabel.frame.origin.y、self.detailTextLabel.frame.size.width widthSub、self.detailTextLabel.frame.size.height ; self.imageView.contentMode = UIViewContentModeScaleAspectFit; } } @終わり

...

-  (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString * CellIdentifier = @ "Cell";

UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if(cell == nil){cell = [[[SizableImageCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; }

cell.textLabel.text = ... cell.detailTextLabel.text = ... cell.imageView.image = ... セルを返す。 }


0


私はicoファイルがどのように動くかについて何も知らないので、多分それは16x16のイメージを手で抽出してそれを使うことが可能であるかもしれません、しかし私は方法がわかりません。

私が知る限り、汎用の `+ UITableViewCell `で画像に有用なプロパティを設定することはできません。 すべてを16x16に縮小する最も簡単な方法(特に面倒な場合、特に使いにくい場合)は、サブクラス ` UITableViewCell `にサブクラスを付け、 ` UIImageView `を与え、常にイメージビューのサイズを16x16に設定し、 contentModeを ` UIViewContentModeAspectFit +`に。


0


私は他の人のカテゴリーを変更しました。すべての画像が同じ幅(見える幅)を占めるようにするためです。

 - (UII画像*)centerImage:(UII画像*)inImage inRect:(CGRect)thumbRect {

CGSize size = thumbRect.size; UIGraphicsBeginImageContext(size); //計算式[inImage drawInRect:CGRectMake((size.width-inImage.size.width)/ 2、(size.height-inImage.size.height)/ 2、inImage.size.width、inImage.size.height)]] ; UIImage * newThumbnail = UIGraphicsGetImageFromCurrentImageContext(); //コンテキストをポップしますUIGraphicsEndImageContext(); newThumbnailを返します。 }