我有一个标准UITableViewCell
,我正在使用文字和图片属性来显示favicon.ico
和标签。在大多数情况下,由于UIImage
支持ICO格式,因此效果非常好。但是,某些网站(如Amazon.com所述)具有favicon.ico
s,它们利用ICO格式在同一文件中存储多种尺寸的能力。亚马逊存储了四种不同的尺寸,一直到48x48。
这导致大多数图像为16x16,除了一些以32x32或48x48进入的图像并使一切看起来很糟糕。我在这里搜索过,官方论坛,文档和其他地方没有成功。我已经尝试了一些我能想到的约束图像尺寸的东西。唯一有效的是一个未记录的方法,我不打算使用它。这是我的第一个应用程序和我第一次使用Cocoa(来自C#)。
如果我不清楚我在寻找什么,理想情况下,建议将围绕设置UIImage
的尺寸,以便48x48版本缩小到16x16或者告诉{ {1}}使用ICO文件中的16x16版本。我不一定需要代码:只是建议一种方法对我没问题。
有没有人有任何建议? (我在官方论坛as well中问道,因为我已经沉睡了一天以上。如果在那里发布解决方案,我也会把它放在这里。)
答案 0 :(得分:23)
这是用户“bcd”在最终解决问题的官方论坛posted上的结果(我自己做了一些修改,使其静态包含在一组实用程序方法中):
+ (UIImage *)scale:(UIImage *)image toSize:(CGSize)size
{
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
}
答案 1 :(得分: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(bitmap);
CGImageRelease(ref);
return result;
}
然后创建一个约束比例的新图像。用您从亚马逊获得的ICO文件替换“图像”。
CGRect sz = CGRectMake(0.0f, 0.0f, 16, 16);
UIImage *resized = resizedImage(image, sz);
答案 2 :(得分:1)
还没有足够的业力来评论答案,但我在上面的bbrandons代码上取得了很好的成功。
我确实在控制台上收到了相当多的警告但是每行的字节数设置不够高 - 在阅读了这个post的答案之后我最终将其设置为0,这让系统确定了正确的值。
例如:
CGContextRef bitmap = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, CGColorSpaceCreateDeviceRGB(), alphaInfo);
答案 3 :(得分: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;
}
}
@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;
}
答案 4 :(得分:0)
我对ico文件的工作方式一无所知,所以也许可以轻松提取16x16图像并使用它,但我不知道如何。
据我所知,无法在通用UITableViewCell
中为图像设置任何有用的属性。最简单的方法(仍然很乱,特别是如果你是新手)将所有内容扩展到16x16将是子类UITableViewCell
,给它一个UIImageView
,总是将图像视图的大小设置为16x16,并且将其contentMode设置为UIViewContentModeAspectFit
。
答案 5 :(得分:0)
我修改了其他人的人物类别,以使所有图像占据相同的宽度(可见宽度),没有缩放:
-(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;
}