Pregunta

Tengo un UITableViewCell estándar en el que estoy usando las propiedades de texto e imágenes para mostrar una favicon.ico y una etiqueta. En su mayor parte, esto funciona muy bien desde UIImage compatible con el formato ICO. Sin embargo, algunos sitios (como Amazon.com decir) tienen favicon.icos que hacen uso de la capacidad del formato ICO para almacenar varios tamaños en el mismo archivo. tiendas de Amazon cuatro tamaños diferentes, todo el camino hasta 48x48.

Esto se traduce en la mayoría de las imágenes de ser de 16x16 a excepción de algunos que vienen en al 32x32 o 48x48 y hacer que todo parezca terrible. He buscado aquí, el foro oficial, la documentación, y en otros lugares sin éxito. He intentado todo lo que podía pensar para limitar el tamaño de la imagen. El único que funcionó fue un método indocumentado, que no estoy a punto de usar. Esta es mi primera aplicación y mi primera experiencia con cacao (vino de C #).

En el caso de que no estaba claro en lo que estoy buscando, lo ideal es el consejo se centraría en torno establecer las dimensiones del UIImage para que la versión 48x48 escalaría hasta 16x16 o un método para contar UIImage utilizar el 16x16 versión presente en el archivo ICO. Yo no necesita un código:. Solo una sugerencia de un enfoque me haría bien

¿Alguien tiene alguna sugerencia? (Pedí en el foro oficial así porque me he hundido más de un día en esto ya. Si una solución no se publica, lo pondré aquí también.)

¿Fue útil?

Solución

Esto es lo que el usuario "bcd" encima en los foros oficiales publicado que terminaron por resolver el problema (con una ligera modificación por mí mismo para que sea estática para su inclusión en un conjunto de métodos de utilidad):

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

Otros consejos

estoy haciendo algo similar en mi aplicación.

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

A continuación, crear una nueva imagen restringir las proporciones. La sustitución de "imagen" con el archivo ICO que se obtiene de Amazon.

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

no tiene suficiente karma aún a comentar sobre las respuestas, pero tenía buen éxito con código bbrandons anteriormente.

Me hizo llegar un buen número de avisos en la consola, aunque en relación con el establecimiento de bytes por fila no ser lo suficientemente alta - después de leer las respuestas a esta poner terminé ponerlo a 0, lo que permite al sistema determinar el valor correcto.

por ejemplo:

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

Así es como lo hice. Esta técnica se encarga de mover las etiquetas de texto y de texto detalle apropiadamente a la izquierda:

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

No sé nada acerca de cómo los archivos ico trabajar, así que quizás es posible extraer cómodamente la imagen de 16x16 y usar eso, pero no tengo ni idea de cómo.

Por lo que yo sé, no es posible establecer ninguna característica útil en la imagen en un UITableViewCell genérico. La forma más sencilla (todavía desordenado, especialmente si eres nuevo en él) para escalar todo, hasta 16x16 sería subclase UITableViewCell, darle una UIImageView, siempre dimensionar la vista de la imagen de 16x16, y establecer su contentMode a UIViewContentModeAspectFit.

He modificado categoría de personas de otros, a fin de que todas las imágenes ocupan el mismo ancho (ancho visible), sin 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top