objective animatedimage iphone uiimageview

iphone - animatedimage - UIImageView: combine UIViewContentModeScaleAspectFit y UIViewContentModeBottom



objective c uiimage (4)

¿Hay alguna manera de evitar el estiramiento de imágenes en un UIImageView y alinearlo al fondo al mismo tiempo? Básicamente, quiero obtener lo que sucedería si fuera posible combinar UIViewContentModeScaleAspectFit y UIViewContentModeBottom s.


Encontré la solución por mi cuenta. Este código cambia el tamaño del UIImageView al tamaño de su image , y lo mueve al pie de su supervista.

CGSize initialImageSize = imageView.size; CGSize imageSize = imageView.image.size; CGFloat aspectRatio = imageSize.width / imageSize.height; CGRect imageFrame = imageView.frame; if (initialImageSize.width / aspectRatio <= initialImageSize.height) { imageFrame.size.width = initialImageSize.width; imageFrame.size.height = imageFrame.size.width / aspectRatio; } else { imageFrame.size.height = initialImageSize.height; imageFrame.size.width = imageFrame.size.height * aspectRatio; } CGRect parentFrame = imageView.superview.frame; imageFrame.origin.y = (parentFrame.origin.y + parentFrame.size.height) - imageFrame.size.height; imageView.frame = imageFrame;


Mi solución:

float newwidth; float newheight; if (image.size.height>=image.size.width){ newheight=imageview.frame.size.height; newwidth=(image.size.width/image.size.height)*newheight; if(newwidth>imageview.frame.size.width){ float diff=imageview.frame.size.width-newwidth; newheight=newheight+diff/newheight*newheight; newwidth=imageview.frame.size.width; } } else{ newwidth=imageview.frame.size.width; newheight=(image.size.height/image.size.width)*newwidth; if(newheight>imageview.frame.size.height){ float diff=imageview.frame.size.height-newheight; newwidth=newwidth+diff/newwidth*newwidth; newheight=imageview.frame.size.height; } }


He encontrado una manera mucho más fácil de hacerlo.

imageView.contentMode = .Bottom imageView.clipToBounds = true

Esto evitará que la imagen cambie de tamaño sin importar en qué marco esté delimitado. Y la parte clipToBounds es importante porque evita que la imagen sin tamaño se salga de los límites de imageView.


Enfoque basado en restricciones

Deberá restringir los lados left , right e bottom del UIImageView mientras se asegura que la relación del tamaño sea la misma que la del UIImage que se muestra.

UIImage *image; // allocate image object here UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; [parent addSubview:imageView]; // add imageView to proper view with addSubview: here UIView *superview = imageView.superview; // match width and bottom of self.superview CGFloat ratio = image.size.width / image.size.height; NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeLeft multiplier:1.f constant:0.f]; NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeBottom multiplier:1.f constant:0.f]; NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superview attribute:NSLayoutAttributeRight multiplier:1.f constant:0.f]; NSLayoutConstraint *ratioConstraint = [NSLayoutConstraint constraintWithItem:imageView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:imageView attribute:NSLayoutAttributeHeight multiplier:ratio constant:1.f]; [imageView addConstraint:ratioConstraint]; [superview addConstraints:@[leftConstraint, bottomConstraint, rightConstraint]];

Esto emulará una combinación de UIViewContentModeScaleAspectFit y UIViewContentModeBottom pero también redimensionará la altura del UIImageView .