¿Cómo get el tamaño de un UIImage escalado en UIImageView?

El atributo image.size de UIImageView proporciona el tamaño del UIImage original. Me gustaría saber el tamaño de la image autoescalada cuando se coloca en el UIImageView (normalmente más pequeño que el original).

Por ejemplo, tengo la image configurada en Aspect Fit . Ahora quiero conocer su nuevo alto y ancho en la pantalla para poder dibujar con precisión en la nueva image escalada.

¿Hay alguna manera de hacer esto sin descubrirlo yo mismo en function del tamaño original de UIImageView size & UIImage (básicamente, la ingeniería inversa de su escala)?

 -(CGRect)frameForImage:(UIImage*)image inImageViewAspectFit:(UIImageView*)imageView { float imageRatio = image.size.width / image.size.height; float viewRatio = imageView.frame.size.width / imageView.frame.size.height; if(imageRatio < viewRatio) { float scale = imageView.frame.size.height / image.size.height; float width = scale * image.size.width; float topLeftX = (imageView.frame.size.width - width) * 0.5; return CGRectMake(topLeftX, 0, width, imageView.frame.size.height); } else { float scale = imageView.frame.size.width / image.size.width; float height = scale * image.size.height; float topLeftY = (imageView.frame.size.height - height) * 0.5; return CGRectMake(0, topLeftY, imageView.frame.size.width, height); } } 

Esta function simple calculará el tamaño de la image después del ajuste del aspecto:

 -(CGSize)imageSizeAfterAspectFit:(UIImageView*)imgview{ float newwidth; float newheight; UIImage *image=imgview.image; if (image.size.height>=image.size.width){ newheight=imgview.frame.size.height; newwidth=(image.size.width/image.size.height)*newheight; if(newwidth>imgview.frame.size.width){ float diff=imgview.frame.size.width-newwidth; newheight=newheight+diff/newheight*newheight; newwidth=imgview.frame.size.width; } } else{ newwidth=imgview.frame.size.width; newheight=(image.size.height/image.size.width)*newwidth; if(newheight>imgview.frame.size.height){ float diff=imgview.frame.size.height-newheight; newwidth=newwidth+diff/newwidth*newwidth; newheight=imgview.frame.size.height; } } NSLog(@"image after aspect fit: width=%f height=%f",newwidth,newheight); //adapt UIImageView size to image size //imgview.frame=CGRectMake(imgview.frame.origin.x+(imgview.frame.size.width-newwidth)/2,imgview.frame.origin.y+(imgview.frame.size.height-newheight)/2,newwidth,newheight); return CGSizeMake(newwidth, newheight); } 

Esta function simple calculará el tamaño de la image:

 [imageView setFrame:AVMakeRectWithAspectRatioInsideRect(image.size, imageView.frame)]; 

Para más detalles, puede consultar Referencia de funciones de AV Foundation .

Una adaptación de la respuesta de cncool , en forma rápida como una extensión UIImageView, tal vez podría ser útil para alguien:

 extension UIImageView{ func frameForImageInImageViewAspectFit() -> CGRect { if let img = self.image { let imageRatio = img.size.width / img.size.height; let viewRatio = self.frame.size.width / self.frame.size.height; if(imageRatio < viewRatio) { let scale = self.frame.size.height / img.size.height; let width = scale * img.size.width; let topLeftX = (self.frame.size.width - width) * 0.5; return CGRectMake(topLeftX, 0, width, self.frame.size.height); } else { let scale = self.frame.size.width / img.size.width; let height = scale * img.size.height; let topLeftY = (self.frame.size.height - height) * 0.5; return CGRectMake(0, topLeftY, self.frame.size.width, height); } } return CGRectMake(0, 0, 0, 0) } } 

Dado que la vista de la image está ajustada a Aspect Fit, puede simplemente tomar el alto y el ancho de la vista de la image junto con el alto y ancho de la image original y calcular la altura y el ancho de la image escalada.

Dicho esto, la mejor manera de hacerlo es tener una vista personalizada en lugar de UIImageView. Luego, dibuje la image usted mismo en la vista personalizada. De esa forma puedes controlar cada aspecto de la misma.

¿Qué tal simplemente get el tamaño UIImageView de su marco? es decir, imageView.frame?

Si el marco se llena manteniendo la relación de aspecto de la image, el marco de image no será el mismo que el tamaño de la image.