Comment get la taille d'un UIImage à l'échelle dans UIImageView?

L'atsortingbut image.size de UIImageView donne la taille de l' UIImage origine. Je voudrais find la taille de l'image mise à l'échelle automatique quand elle est placée dans le UIImageView (généralement plus petit que l'original).

Par exemple, j'ai l'image définie sur Aspect Fit . Maintenant, je veux connaître sa nouvelle hauteur et largeur sur l'écran afin que je puisse dessiner avec précision sur la nouvelle image mise à l'échelle.

Existe-t-il un moyen de le faire sans le déterminer moi-même en fonction de la taille d'UIImageView et de la taille d'origine de UIImage (en procédant essentiellement à l'ingénierie inverse de sa mise à l'échelle)?

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

Cette fonction simple va calculer la taille de l'image: –

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

Pour plus de détails, vous pouvez vous référer à AV Foundation Functions Reference .

Cette fonction simple va calculer la taille de l'image après ajustement de l'aspect:

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

Une adaptation de la réponse cncool , dans swift comme une extension UIImageView, peut-être pourrait-elle être utile à quelqu'un:

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

Comme la vue d'image est réglée sur Aspect Fit, vous pouvez simplement prendre la hauteur et la largeur de l'image ainsi que la hauteur et la largeur de l'image originale et calculer la hauteur et la largeur de l'image mise à l'échelle.

Cela dit, la meilleure façon de le faire est d'avoir une vue personnalisée au lieu d'un UIImageView. Ensuite, dessinez l'image vous-même dans la vue personnalisée. De cette façon, vous pouvez contrôler tous les aspects de celui-ci.

Que diriez-vous juste get la taille UIImageView de son cadre? c'est-à-dire imageView.frame?

Si la trame est remplie en conservant le format de l'image, le cadre de la vue image ne sera pas identique à la taille de l'image.