2012-01-02 21 views
15

Tengo UIImageView con modo de contenido Aspecto ajustado de tamaño 220x155. Estoy insertando dinámicamente diferentes imágenes en diferentes resoluciones, pero todas más grandes que el tamaño de UIImageView. Como el modo de contenido está configurado en Aspecto ajustado, la imagen se escala con respecto a la relación para adaptarse al UIImageView.UIImageView: ¿Cambiar el tamaño al tamaño de la imagen?

Mi problema es que si, por ejemplo, la imagen dentro de UIImageView se escala a 220x100, me gustaría que el UIImageView se encoja desde una altura de 155 a 100 también para evitar el espacio entre mis elementos.

¿Cómo puedo hacer esto?

+0

tengo el mismo problema, la imagen se establece en el centro pero obtiene espacio en el lado superior e inferior. ¿Cómo puedo resolverlo? por favor, ayúdenme – Hiren

Respuesta

28

Si te tengo derecho, sería algo como esto: obtener tamaño de la imagen:

relación de escala
UIImage * img = [UIImage imageNamed:@"someImage.png"]; 
CGSize imgSize = img.size; 

calcular el ancho

float ratio=yourImageView.frame.size.width/imgSize.width; 

cheque altura reducido (usando misma proporción para mantener aspecto)

float scaledHeight=imgSize.height*ratio; 
if(scaledHeight < yourImageView.frame.size.height) 
{ 
    //update height of your imageView frame with scaledHeight 
} 
+0

Me ha ayudado mucho. Gracias –

0

Última edición:

Parece que he entendido mal la pregunta.

para obtener el tamaño real que usted podría intentar:

CGSize imageSize = img.size; 
CGSize viewSize = imageView.frame.size; 
CGSize actualSize; 

if (imageSize.width > imageSize.height) { 
    actualSize.width = imageSize.width > viewSize.width ? viewSize.width : imageSize.width; 

    actualSize.height = imageSize.height * actualSize.width/imageSize.width; 
} 
else { 
    actualSize.height = imageSize.height > viewSize.height ? viewSize.height : imageSize.height; 

    actualSize.width = imageSize.width * actualSize.height/imageSize.height; 
} 
+0

Bueno, eso no funciona. Digamos que mi imagen es 440x200. Cuando esta imagen se inserta en mi ImageView, su tamaño se cambiará a 220x100 para adaptarse a UIImageView. Su código establecería la altura del UIImageView en 200, mientras que me gustaría saber la altura de la imagen después de que el UIImageView haya escalado la imagen. – dhrm

+0

Siempre puede verificar la altura y solo aplicar esto si la altura de la imagen es menor que su altura máxima actual para las imágenes y solo luego aplicar este tipo de cambio. –

+0

Lo siento, pero no estoy seguro de que entiendas mi problema. Tu código cambiaría el tamaño de UIImageView por el tamaño de mi imagen; eso no es lo que quiero. Me gustaría que mi imagen se ajuste dentro de mi caja de 220x115. Pero cuando la relación de la imagen no es como la proporción de mi caja de 220x115, a veces es más ancha que más alta, lo que da espacio en blanco en la parte superior e inferior de UIImageView. Para evitar esto, me gustaría reducir la altura del UIImageView a la altura a la que se redujo la escala de la imagen. – dhrm

20

Sobre la base de la respuesta de Michael, aquí hay un método completo

+ (CGSize)makeSize:(CGSize)originalSize fitInSize:(CGSize)boxSize 
{ 
    float widthScale = 0; 
    float heightScale = 0; 

    widthScale = boxSize.width/originalSize.width; 
    heightScale = boxSize.height/originalSize.height; 

    float scale = MIN(widthScale, heightScale); 

    CGSize newSize = CGSizeMake(originalSize.width * scale, originalSize.height * scale); 

    return newSize; 
} 
+0

Estoy usando esta función en mi proyecto y funciona bien. –

3

Editar la respuesta de Steven Stefanik: rompe este método cuando OriginalSize es {0, 0}. Tal vez tenga en cuenta estos cambios

-(CGSize)makeSize:(CGSize)originalSize fitInSize:(CGSize)boxSize 
{ 
    if (originalSize.height == 0) { 
     originalSize.height = boxSize.height; 
    } 
    if (originalSize.width == 0) { 
     originalSize.width = boxSize.width; 
    } 

    float widthScale = 0; 
    float heightScale = 0; 

    widthScale = boxSize.width/originalSize.width; 
    heightScale = boxSize.height/originalSize.height; 

    float scale = MIN(widthScale, heightScale); 

    CGSize newSize = CGSizeMake(originalSize.width * scale, originalSize.height * scale); 

    return newSize; 
} 
Cuestiones relacionadas