ios - create uiimageview programmatically swift 4
UIImageView ajuste de ajuste y centro (9)
Configurar el contentMode de imageView a UIViewContentModeScaleAspectFit
fue suficiente para mí. Parece centrar las imágenes también. No estoy seguro de por qué otros usan lógica basada en la imagen. Ver también esta pregunta: ajuste de aspecto iOS y centro
Tengo una vista de imagen, declarada programáticamente, y estoy configurando su imagen, también mediante programación.
Sin embargo, no puedo configurar la imagen para que se ajuste al aspecto y alinee el centro con la vista de la imagen.
En otras palabras, quiero que la imagen:
- Escala hacia abajo para adaptarse al aspecto, si la imagen es grande.
- Centrar pero no ampliar, si la imagen es pequeña.
¿Cómo lo consigo?
En un lenguaje rápido, podemos configurar el modo de contenido de la vista de UIImage de la siguiente manera:
let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit
Esta subclase utiliza el centro si la imagen no es más grande que la vista, de lo contrario, se reduce. Encontré esto útil para un UIImageView
que cambia el tamaño.
La imagen que muestra es más pequeña que la vista para tamaños grandes, pero más grande que la vista para tamaños pequeños. Solo lo quiero escalar, pero no subir.
class CenterScaleToFitImageView: UIImageView {
override var bounds: CGRect {
didSet {
adjustContentMode()
}
}
override var image: UIImage? {
didSet {
adjustContentMode()
}
}
func adjustContentMode() {
guard let image = image else {
return
}
if image.size.width > bounds.size.width ||
image.size.height > bounds.size.height {
contentMode = .ScaleAspectFit
} else {
contentMode = .Center
}
}
}
Para las personas que buscan el cambio de tamaño de UIImage,
@implementation UIImage (Resize)
- (UIImage *)scaledToSize:(CGSize)size
{
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
[self drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
- (UIImage *)aspectFitToSize:(CGSize)size
{
CGFloat aspect = self.size.width / self.size.height;
if (size.width / aspect <= size.height)
{
return [self scaledToSize:CGSizeMake(size.width, size.width / aspect)];
} else {
return [self scaledToSize:CGSizeMake(size.height * aspect, size.height)];
}
}
- (UIImage *)aspectFillToSize:(CGSize)size
{
CGFloat imgAspect = self.size.width / self.size.height;
CGFloat sizeAspect = size.width/size.height;
CGSize scaledSize;
if (sizeAspect > imgAspect) { // increase width, crop height
scaledSize = CGSizeMake(size.width, size.width / imgAspect);
} else { // increase height, crop width
scaledSize = CGSizeMake(size.height * imgAspect, size.height);
}
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClipToRect(context, CGRectMake(0, 0, size.width, size.height));
[self drawInRect:CGRectMake(0.0f, 0.0f, scaledSize.width, scaledSize.height)];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
@end
Puede lograr esto estableciendo el modo de contenido de la vista de imagen en UIViewContentModeScaleAspectFill.
Luego use el siguiente método para obtener el objeto de uiimage redimensionado.
- (UIImage*)setProfileImage:(UIImage *)imageToResize onImageView:(UIImageView *)imageView
{
CGFloat width = imageToResize.size.width;
CGFloat height = imageToResize.size.height;
float scaleFactor;
if(width > height)
{
scaleFactor = imageView.frame.size.height / height;
}
else
{
scaleFactor = imageView.frame.size.width / width;
}
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), NO, 0.0);
[imageToResize drawInRect:CGRectMake(0, 0, width * scaleFactor, height * scaleFactor)];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resizedImage;
}
Editado aquí (Versión Swift)
func setProfileImage(imageToResize: UIImage, onImageView: UIImageView) -> UIImage
{
let width = imageToResize.size.width
let height = imageToResize.size.height
var scaleFactor: CGFloat
if(width > height)
{
scaleFactor = onImageView.frame.size.height / height;
}
else
{
scaleFactor = onImageView.frame.size.width / width;
}
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), false, 0.0)
imageToResize.drawInRect(CGRectMake(0, 0, width * scaleFactor, height * scaleFactor))
let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return resizedImage;
}
Resolví este problema así.
- setImage a
UIImageView
(conUIViewContentModeScaleAspectFit
) - obtener imageSize
(CGSize imageSize = imageView.image.size)
-
UIImageView
cambiar el tamaño.[imageView sizeThatFits:imageSize]
- mueve la posición donde quieras.
Quería UIView para poner en el centro superior de UICollectionViewCell
. entonces, usé esta función.
- (void)setImageToCenter:(UIImageView *)imageView
{
CGSize imageSize = imageView.image.size;
[imageView sizeThatFits:imageSize];
CGPoint imageViewCenter = imageView.center;
imageViewCenter.x = CGRectGetMidX(self.contentView.frame);
[imageView setCenter:imageViewCenter];
}
Esto funciona para mi.
Solo pegando la solución:
Al igual que @manohar dijo
imageView.contentMode = UIViewContentModeCenter;
if (imageView.bounds.size.width > ((UIImage*)imagesArray[i]).size.width && imageView.bounds.size.height > ((UIImage*)imagesArray[i]).size.height) {
imageView.contentMode = UIViewContentModeScaleAspectFit;
}
resuelto mi problema
[your_imageview setContentMode:UIViewContentModeCenter];
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);