Pergunta

Eu tenho um UITableViewCell padrão onde eu estou usando as propriedades de texto e imagem para exibir um favicon.ico e uma etiqueta. Para a maior parte, isso funciona muito bem desde UIImage suporta o formato ICO. No entanto, alguns sites (como Amazon.com digamos) têm favicon.icos que fazem uso da capacidade do formato ICO para armazenar vários tamanhos no mesmo arquivo. Amazon lojas de quatro tamanhos diferentes, todo o caminho até 48x48.

Isso resulta em imagens mais sendo 16x16 com exceção de alguns que vêm em 32x32 ou 48x48 e fazer tudo parecer terrível. Tenho pesquisado aqui, o fórum oficial, a documentação, e em outros lugares, sem sucesso. Eu tentei tudo que eu poderia pensar para restringir o tamanho da imagem. A única coisa que funcionou foi um método não documentado, que eu não estou a ponto de uso. Este é o meu primeiro aplicativo e minha primeira experiência com Cacau (veio de C #).

No caso de eu não estava claro no que eu estou procurando, idealmente o conselho seria giram em torno definindo as dimensões da UIImage para que a versão 48x48 iria escalar até 16x16 ou um método para contar UIImage usar o 16x16 versão presente no arquivo ICO. Eu não precisa necessariamente código:. Apenas uma sugestão de uma abordagem iria me fazer muito bem

Alguém tem alguma sugestão? (Eu perguntei no fórum oficial bem porque eu tenho afundado mais de um dia em isso já. Se uma solução é postado lá, eu vou colocá-lo aqui também.)

Foi útil?

Solução

Aqui está o usuário "bcd" over nos fóruns oficiais postou que acabou solving o problema (com uma ligeira modificação por mim para torná-lo estático para inclusão em um conjunto de métodos utilitários):

+ (UIImage *)scale:(UIImage *)image toSize:(CGSize)size
{
    UIGraphicsBeginImageContext(size);
    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return scaledImage;
}

Outras dicas

Estou fazendo algo semelhante em meu aplicativo.

    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;
}

Em seguida, criar uma nova imagem restringindo as proporções. Substituir "imagem" com o arquivo ICO que você começa de Amazon.

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

não têm karma suficiente ainda a comentar sobre as respostas, mas eu tinha um bom sucesso com código bbrandons acima.

Eu consegui um bom número de avisos no console embora em relação bytes por linha definindo não ser alta o suficiente - depois de ler respostas a esta pós acabei definindo-o como 0, que permite que o sistema determine o valor correto.

por exemplo:

CGContextRef bitmap = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, CGColorSpaceCreateDeviceRGB(), alphaInfo);

Aqui está como eu fiz isso. Esta técnica se encarrega de mover o texto e texto de detalhe rótulos de forma adequada para a esquerda:

@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;
}

Eu não sei nada sobre como ico arquivos de trabalho, talvez por isso é possível extrair com folga a imagem 16x16 e usar isso, mas não tenho idéia de como.

Tanto quanto eu estou ciente, não é possível definir as propriedades úteis sobre a imagem em um UITableViewCell genérico. A maneira mais simples (ainda confuso, especialmente se você é novo para ele) a escala de tudo, até 16x16 seria UITableViewCell subclasse, dar-lhe um UIImageView, sempre o tamanho da visualização da imagem de 16x16, e defina seu contentMode para UIViewContentModeAspectFit.

Eu modifiquei categoria as pessoas dos outros, a fim de fazer todas as imagens ocupam a mesma largura (largura visível), sem escala:

-(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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top