Aspecto UIImageView ajuste y centro

183

Tengo una vista de imagen, declarada mediante programación, y estoy configurando su imagen, también mediante programación.

Sin embargo, no puedo configurar la imagen para que se ajuste al aspecto y alinear el centro con la vista de la imagen.

En otras palabras, quiero que la imagen:

  • Reduzca para ajustarse al aspecto, si la imagen es grande.
  • Centra pero no escala, si la imagen es pequeña.

¿Cómo consigo eso?

Ravi Vooda
fuente
19
[yourImageView setContentMode: UIViewContentModeCenter]; y asegúrese de que el marco de imagen es mayor que el marco de imagen. si no es así, coloque [yourImageView setContentMode: UIViewContentModeAspectToFit];
Manohar Perepa
1
if else condition dude @RyanPoolos
Manohar Perepa

Respuestas:

205

Solo pegando la solución:

Justo como dijo @manohar

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

Ravi Vooda
fuente
77
El camino más corto para descubrir la imagen es más pequeño:CGRectContainsRect(imageView.bounds, {CGPointZero, image.size})
Cfr
@Cfr tal vez sea más corto, pero no tan legible. Al mismo tiempo, propongo dividir línea con sentencia if-como esto: CGSize imageSize = ((UIImage*)imagesArray[i]).size;, CGSize viewSize = imageView.bounds.size, if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {.
Timur Bernikovich
1
Debería ser UIViewContentModeScaleAspectFit
NoelHunter
imageView.contentMode = UIViewContentModeScaleAspectFit;
Arjay Waran
75

En un lenguaje rápido, podemos configurar el modo de contenido de la vista UIImage de la siguiente manera:

let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit
Ali Raza
fuente
3
Esto explota la imagen si es más pequeña que la vista de la imagen, al contrario de lo que solicitó el OP.
fishinear
18

Rápido

yourImageView.contentMode = .center

Puede usar las siguientes opciones para posicionar su imagen:

  • scaleToFill
  • scaleAspectFit // contenido escalado para ajustarse al aspecto fijo. el resto es transparente
  • redraw // redibujar en cambio de límites (llamadas -setNeedsDisplay)
  • center// los contenidos permanecen del mismo tamaño. posicionado ajustado.
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight
Jonas Deichelmann
fuente
12

Respuesta actualizada

Cuando originalmente respondí esta pregunta en 2014, no había ningún requisito para no escalar la imagen en el caso de una imagen pequeña. (La pregunta se editó en 2015 ). Si tiene ese requisito, deberá comparar el tamaño de la imagen con el de imageView y usarlo UIViewContentModeCenter(en el caso de una imagen más pequeña que imageView) o UIViewContentModeScaleAspectFiten todos los demás casos .

Respuesta original

Establecer el contentMode de imageView en UIViewContentModeScaleAspectFitfue suficiente para mí. Parece centrar las imágenes también. No estoy seguro de por qué otros están usando la lógica basada en la imagen. Vea también esta pregunta: ajuste y centro del aspecto iOS

Nate Cook
fuente
1
Esto explota la imagen si es más pequeña que la vista de la imagen, al contrario de lo que solicitó el OP.
fishinear
1
@fishinear El requisito de no ampliar la imagen se agregó a la pregunta un año después de que la respondí: stackoverflow.com/posts/15499376/revisions
Nate Cook,
10

Resolví este problema así.

  1. setImage a UIImageView(con UIViewContentModeScaleAspectFit)
  2. obtener imageSize (CGSize imageSize = imageView.image.size)
  3. UIImageView cambiar el tamaño [imageView sizeThatFits:imageSize]
  4. mueve la posición donde quieras.

Quería poner UIView 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.

Nicejinux
fuente
8

Esta subclase usa el centro si la imagen no es más grande que la vista, de lo contrario, se reduce. Encontré esto útil para un UIImageViewque 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. Quiero que solo se reduzca, pero no hacia arriba.

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
        }
    }
}
Orkoden
fuente
8

Puede lograr esto configurando el modo de contenido de la vista de imagen en UIViewContentModeScaleAspectFill.

Luego use el siguiente método para obtener el objeto 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;
}
Manish
fuente
7
[your_imageview setContentMode:UIViewContentModeCenter];
souvickcse
fuente
17
Esto ignorará la escala
Skrew
2
No sé por qué soluciones como esta obtuvieron tantos votos positivos. Esta persona claramente no leyó la pregunta en absoluto.
lento el
7
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);
Antony Ouseph
fuente
Esto explota la imagen si es más pequeña que la vista de la imagen, al contrario de lo que solicitó el OP.
fishinear
2

Para las personas que buscan cambiar el 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
karim
fuente