UITableViewCellの画像にUIImageのサイズを設定します
-
06-09-2019 - |
質問
私はUITableViewCell
とラベルを表示するには、テキストや画像のプロパティを使用してい標準favicon.ico
を持っています。 UIImage
はICO形式をサポートしているため、ほとんどの部分については、これは本当によく働きます。しかし、いくつかのサイト( Amazon.com のように言う)ICO形式の能力を活用しfavicon.ico
sを持っています同じファイルに複数のサイズを格納します。アマゾン店4種類のサイズ、48×48までのすべての道ます。
これは、ほとんどの画像は32×32または48×48の中に来て、すべてが恐ろしい見えるようにそのいくつかを除いて、16×16であることになります。私は、公式フォーラム、ドキュメント、ここで検索、および他の場所での成功なしています。私は、画像のサイズを制限するために考えることができるすべてを試してみました。働いていた唯一の事は、私が使用しようとしていないよ文書化されていない方法でした。これは、(C#のから来た)私の最初のアプリとココアと私の初めての経験です。
の場合、私は、48×48のバージョンは16×16を使用するUIImage
を伝えるために、16×16またはメソッドに縮小なるように、理想的なアドバイスがUIImage
の寸法を設定することを中心に考え、私が探しているものの中に明確ではありませんでしたICOファイルに存在したバージョン。私は必ずしもコードを必要としません:。ちょうどアプローチの提案は罰金私を行うだろう。
誰もが何か提案がありますか?私はに1日以上沈んできたので、(私は公式フォーラムでにもを尋ねました溶液がそこに掲載されている場合は、これはもう、私はここにもそれを置くでしょう。)
解決
ここで、ユーザは、公式フォーラムでオーバー「BCD」何は解決終わったに投稿しました(ユーティリティメソッドのセットに含めるため、それは静的にする自分で若干の修正と)問題:
+ (UIImage *)scale:(UIImage *)image toSize:(CGSize)size
{
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
}
他のヒント
私は私のアプリで同様の何かをやっています。
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(bitmap);
CGImageRelease(ref);
return result;
}
次に比率を制約する新しいイメージを作成します。 ICOと「イメージ」を交換すると、あなたはアマゾンから取得するファイルます。
CGRect sz = CGRectMake(0.0f, 0.0f, 16, 16);
UIImage *resized = resizedImage(image, sz);
は、回答にコメントするにはまだ十分なカルマを持っていないが、私は上記のbbrandonsコードとの良好な成功を収めています。
十分な高されていない設定の行あたりのバイトに関するけれども、私は、コンソール上の警告のかなりの数を手に入れた - これに答えを読んだ後、<のhref = "https://stackoverflow.com/questions/2235210/image-resizedシステムは正しい値を決定することができます-error-cgbitmapcontextcreate-サポートされていないパラメータ/ 2235465#2235465" > の投稿、私は0に設定することになった、。
例:
CGContextRef bitmap = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, CGColorSpaceCreateDeviceRGB(), alphaInfo);
ここで私はそれをやった方法です。この技術は、左側に適切にテキストと詳細テキストラベルを移動するの面倒を見る:
@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;
}
}
@end
...
- (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 = ...
return cell;
}
私は多分それは手近に16×16の画像を抽出し、それを使用することが可能ですが、どのように動作するかICOファイルについては何も知らないが、私はどのように考えている。
私の知る限り承知しているとして、それは一般的なUITableViewCell
に画像上の任意の有用な特性を設定することはできません。 16×16までのすべてを拡張する(まだ汚い、あなたはそれに慣れてい場合は特に)最も簡単な方法は、UITableViewCell
をサブクラス化することでそれをUIImageView
を与え、常に16×16に画像表示をサイズ、およびUIViewContentModeAspectFit
するそのcontentModeを設定します。でしょうP>
私はスケーリングせず、全ての画像は同じ幅(表示幅)を占めるようにするために、他人の人々のカテゴリを変更しました。
-(UIImage*) centerImage:(UIImage *)inImage inRect:(CGRect) thumbRect
{
CGSize size= thumbRect.size;
UIGraphicsBeginImageContext(size);
//calculation
[inImage drawInRect:CGRectMake((size.width-inImage.size.width)/2, (size.height-inImage.size.height)/2, inImage.size.width, inImage.size.height)];
UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();
// pop the context
UIGraphicsEndImageContext();
return newThumbnail;
}