7

我有一个标准UITableViewCell,我使用文本和图像属性来显示一个favicon.ico和一个标签。在大多数情况下,这非常有效,因为UIImage它支持 ICO 格式。然而,一些网站(比如Amazon.com)有favicon.icos,它们利用 ICO 格式在同一个文件中存储多种尺寸的能力。亚马逊存储四种不同的尺寸,一直到 48x48。

这导致大多数图像都是 16x16,除了少数 32x32 或 48x48 的图像,这会使一切看起来很糟糕。我在这里、官方论坛、文档和其他地方都搜索过,但没有成功。我已经尝试了所有我能想到的限制图像大小的方法。唯一有效的是一种未记录的方法,我不打算使用它。这是我的第一个应用程序,也是我第一次使用 Cocoa(来自 C#)。

如果我不清楚我在寻找什么,理想情况下,建议将围绕设置尺寸为中心,UIImage以便 48x48 版本缩小到 16x16 或告诉UIImage使用 ICO 中存在的 16x16 版本的方法文件。我不一定需要代码:只需提出一种方法的建议就可以了。

有没有人有什么建议?(我也在官方论坛上问过,因为我已经沉迷了一天多。如果在那里发布了解决方案,我也会把它放在这里。)

4

6 回答 6

23

以下是用户“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;
}
于 2009-06-02T21:15:42.350 回答
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);
于 2009-06-02T20:55:40.643 回答
1

还没有足够的业力来评论答案,但我在上面的 bbrandons 代码上取得了很好的成功。

尽管关于每行字节数设置不够高,但我确实在控制台上收到了相当数量的警告 - 在阅读了这篇文章的答案后,我最终将其设置为 0,这让系统可以确定正确的值。

例如:

CGContextRef bitmap = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, CGColorSpaceCreateDeviceRGB(), alphaInfo);
于 2010-03-21T05:49:01.837 回答
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;
}
于 2011-04-21T06:17:13.380 回答
0

我对 ico 文件的工作原理一无所知,所以也许可以轻松地提取 16x16 图像并使用它,但我不知道如何。

据我所知,不可能在通用的图像上设置任何有用的属性UITableViewCell。将所有内容缩小到 16x16 的最简单方法(仍然很混乱,尤其是如果您是新手)是 subclass UITableViewCell,给它一个UIImageView,始终将图像视图大小设置为 16x16,并将其 contentMode 设置为UIViewContentModeAspectFit.

于 2009-06-02T20:43:20.510 回答
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;
}
于 2012-04-27T18:28:26.773 回答