Установка размеров UIImage на изображении UITableViewCell - PullRequest
7 голосов
/ 03 июня 2009

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

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

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

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

Ответы [ 6 ]

23 голосов
/ 03 июня 2009

Вот что пользователь "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;
}
4 голосов
/ 03 июня 2009

Я делаю нечто подобное в моем приложении.

    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);
1 голос
/ 21 апреля 2011

Вот как я это сделал. Этот метод обеспечивает перемещение текста и подробных текстовых меток соответственно влево:

@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;
}
1 голос
/ 21 марта 2010

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

Я получил достаточное количество предупреждений на консоли, хотя относительно того, что количество байтов в строке недостаточно высоко - после прочтения ответов на этот пост я в итоге установил 0, что позволяет системе правильное значение.

например:

CGContextRef bitmap = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, CGColorSpaceCreateDeviceRGB(), alphaInfo);
0 голосов
/ 27 апреля 2012

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

-(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;
}
0 голосов
/ 03 июня 2009

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

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

...