2009-06-02 13 views
7

Tengo un estándar UITableViewCell donde uso las propiedades de texto y de imagen para mostrar favicon.ico y una etiqueta. En su mayor parte, esto funciona muy bien ya que UIImage es compatible con el formato ICO. Sin embargo, algunos sitios (como Amazon.com dicen) tienen favicon.ico s que hacen uso de la capacidad del formato ICO para almacenar múltiples tamaños en el mismo archivo. Amazon almacena cuatro tamaños diferentes, hasta 48x48.Configuración de las dimensiones de UIImage en la imagen UITableViewCell

Esto da como resultado que la mayoría de las imágenes sean 16x16, excepto algunas que vienen a 32x32 o 48x48 y hacen que todo se vea terrible. He buscado aquí, el foro oficial, la documentación y en otros lugares sin éxito. He intentado todo lo que pude pensar para restringir el tamaño de la imagen. Lo único que funcionó fue un método no documentado, que no voy a utilizar. Esta es mi primera aplicación y mi primera experiencia con Cocoa (vino de C#).

En caso de que no fuera claro lo que estoy buscando, lo ideal sería que el asesoramiento se centre en establecer las dimensiones del UIImage para que la versión 48x48 se reduzca a 16x16 o un método para indicar UIImage para usar Versión 16x16 presente en el archivo ICO. No necesito código necesariamente: solo una sugerencia de un enfoque me haría bien.

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

Respuesta

23

Esto es lo que el usuario "bcd" encima en los foros oficiales posted que terminaron la solución del 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; 
} 
+0

La versión de BCD era una categoría de 'UIImage', que tiene mucho más sentido que lo que hice aquí. – bbrown

+0

Gracias por su respuesta, funciona perfectamente –

0

No sé nada sobre cómo Los archivos ico funcionan, entonces quizás sea posible extraer la imagen 16x16 y usarla, pero no tengo idea de cómo.

Que yo sepa, no es posible establecer ninguna propiedad útil en la imagen en un genérico UITableViewCell. La forma más sencilla (aún desordenada, especialmente si es nuevo) de escalar todo a 16x16 sería la subclase UITableViewCell, otorgarle un UIImageView, siempre ajustar el tamaño de la vista de imagen a 16x16 y establecer su modo de contenido en UIViewContentModeAspectFit.

+0

Intenté este enfoque y no funcionó, pero probablemente lo estaba haciendo mal. – bbrown

4

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, cree una nueva imagen que limite las proporciones. Reemplazando "imagen" con el archivo ICO que obtienes de Amazon.

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

Por alguna razón, tu código me arrojaba muchos errores CoreGraphics. Podría ser un problema con el formato ICO. Aunque es una buena respuesta. – bbrown

+1

¿Compilaron/vincularon los errores? No creo que Xcode se vincule con el marco de CoreGraphics de forma predeterminada para nuevos proyectos, por lo que deberá agregar eso y la correspondiente declaración @import. –

+1

Sí, necesita vincularse al marco de CoreGraphics. Si no lo hiciste, sería por eso que estás obteniendo esos errores. –

1

Aún no tengo suficiente karma para comentar las respuestas, pero tuve un buen éxito con el código de bbrandons anterior.

Obtuve un buen número de advertencias en la consola, aunque la configuración de bytes por fila no es lo suficientemente alta - después de leer las respuestas a esta post terminé configurándola en 0, lo que permite que el sistema determine el valor correcto.

por ejemplo:

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

Si afirmó 8 bits por componente, eso es 1 byte por componente. La respuesta de brandon previene 'kCGImageAlphaNone', por lo tanto, para un espacio de color RGB, siempre hay cuatro componentes (tres colores, más alfa). Eso es 1 × 4 = 4 bytes por píxel. Por lo tanto, él y usted deben multiplicar el ancho (píxeles por fila) por 4, no 3. Al pasar 0 no está documentado que funcione, por lo que probablemente no debe confiar en él y no debe usar ese truco o archivo. error de documentación que solicita que se documente: https://bugreport.apple.com –

+0

Gracias por su descripción de los cálculos Peter, tiene sentido. También presentaré un error de documentación para el cálculo automático. – crafterm

1

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

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