ios - objective - uiimageview set image swift
¿Cómo obtener el tamaño de un UIImage escalado en UIImageView? (7)
El atributo image.size
de UIImageView
proporciona el tamaño del UIImage
original. Me gustaría averiguar el tamaño de la imagen con escala automática cuando se coloca en el UIImageView
(generalmente más pequeño que el original).
Por ejemplo, tengo la imagen configurada en Aspect Fit
. Ahora quiero saber su nueva altura y ancho en la pantalla para poder dibujar con precisión la nueva imagen a escala.
¿Hay alguna manera de hacer esto sin resolverlo yo mismo basado en el tamaño UIImageView y el tamaño original de UIImage (básicamente ingeniería inversa de su escalado)?
¿Qué tal si obtienes el tamaño UIImageView de su marco? es decir, imageView.frame?
Si el marco se llena manteniendo la relación de aspecto de la imagen, el marco de la vista de la imagen no será el mismo que el tamaño de la imagen.
Dado que tiene la vista de imagen configurada en Ajuste de aspecto, puede simplemente tomar el alto y el ancho de la vista de la imagen junto con el alto y ancho de la imagen original y calcular el alto y el ancho de la imagen escalada.
Dicho esto, la mejor forma de hacerlo es tener una vista personalizada en lugar de una UIImageView. Luego, dibuje la imagen usted mismo en la vista personalizada. De esa forma puedes controlar cada aspecto de eso.
-(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 sencilla función calculará el tamaño de la imagen:
[imageView setFrame:AVMakeRectWithAspectRatioInsideRect(image.size, imageView.frame)];
Para obtener más información, puede consultar la Referencia de funciones de AV Foundation .
Esta sencilla función calculará el tamaño de la imagen después del ajuste de 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);
}
Una adaptación de la respuesta de cncool , en una extensión rápida como 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)
}
}