Вопрос

у меня стандарт UITableViewCell где я использую свойства текста и изображения для отображения favicon.ico и этикетка.По большей части это работает очень хорошо, поскольку UIImage поддерживает формат ICO.Однако некоторые сайты (например, Amazon.com скажем) есть favicon.icos, которые используют способность формата ICO хранить несколько размеров в одном файле.Amazon хранит четыре разных размера, вплоть до 48x48.

В результате большинство изображений имеют размер 16x16, за исключением некоторых, которые имеют размер 32x32 или 48x48, из-за чего все выглядит ужасно.Я безуспешно искал здесь, на официальном форуме, в документации и где-либо еще.Я перепробовал все, что мог придумать, чтобы ограничить размер изображения.Единственное, что сработало, — это недокументированный метод, который я не собираюсь использовать.Это мое первое приложение и мой первый опыт работы с Cocoa (пришел из C#).

В случае, если мне неясно, что я ищу, в идеале совет будет сосредоточен на установке размеров UIImage чтобы версия 48x48 уменьшалась до 16x16 или как-то это определить UIImage использовать версию 16x16, присутствующую в файле ICO.Мне не обязательно нужен код:просто предложение подхода мне подойдет.

У кого-нибудь есть предложения?(Я спрашивал на официальном форуме также потому что я уже потратил на это больше суток.Если там будет опубликовано решение, я размещу его и здесь.)

Это было полезно?

Решение

Вот что пишет пользователь «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, который вы получаете от Amazon.

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

У меня еще недостаточно кармы, чтобы комментировать ответы, но я добился хороших результатов с приведенным выше кодом bbrandons.

Я получил довольно много предупреждений на консоли, хотя настройка байтов на строку недостаточно высока - после прочтения ответов на этот вопрос. почта В итоге я установил его на 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;
}

Я ничего не знаю о том, как работают ico-файлы, так что, возможно, можно легко извлечь изображение 16x16 и использовать его, но я понятия не имею, как это сделать.

Насколько мне известно, невозможно установить какие-либо полезные свойства изображения в общем виде. UITableViewCell.Самый простой способ (все еще запутанный, особенно если вы новичок в этом деле) уменьшить все до 16x16 — это создать подкласс UITableViewCell, дайте ему UIImageView, всегда выбирайте размер изображения 16x16 и устанавливайте для его contentMode значение UIViewContentModeAspectFit.

Я изменил категорию людей других людей, чтобы все изображения имели одинаковую ширину (видимую ширину) БЕЗ МАСШТАБИРОВАНИЯ:

-(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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top