Ajuste e aspecto do aspecto do UIImageView

183

Eu tenho uma exibição de imagem, declarada programaticamente, e estou definindo sua imagem, também programaticamente.

No entanto, não consigo definir a imagem para se ajustar ao aspecto e alinhar o centro à visualização da imagem.

Em outras palavras, quero que a imagem:

  • Reduza para ajustar ao aspecto, se a imagem for grande.
  • Centralize, mas não aumente a escala, se a imagem for pequena.

Como faço para conseguir isso?

Ravi Vooda
fonte
19
[yourImageView setContentMode: UIViewContentModeCenter]; e verifique se o quadro imageView é maior que o quadro da imagem. se não estiver, coloque [yourImageView setContentMode: UIViewContentModeAspectToFit];
Manohar Perepa 19/03/2013
1
Se mais condição cara @RyanPoolos #
Manohar Perepa 19/03

Respostas:

205

Apenas colando a solução:

Assim como @manohar disse

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

resolveu meu problema

Ravi Vooda
fonte
7
A maneira mais curta de descobrir a imagem é menor:CGRectContainsRect(imageView.bounds, {CGPointZero, image.size})
Cfr
@ CF talvez seja mais curto, mas não tão legível. Ao mesmo tempo, proponho dividir linha com if-declaração como esta: CGSize imageSize = ((UIImage*)imagesArray[i]).size;, CGSize viewSize = imageView.bounds.size, if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {.
Timur Bernikovich
1
Deve ser UIViewContentModeScaleAspectFit
NoelHunter
imageView.contentMode = UIViewContentModeScaleAspectFit;
Arjay Waran
75

Em linguagem rápida, podemos definir o modo de conteúdo da visualização UIImage da seguinte forma:

let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit
Ali Raza
fonte
3
Isso explode a imagem se ela for menor que a visualização da imagem, ao contrário do que o OP solicitou.
fishinear perto de 15/0918
18

Rápido

yourImageView.contentMode = .center

Você pode usar as seguintes opções para posicionar sua imagem:

  • scaleToFill
  • scaleAspectFit // conteúdo dimensionado para se ajustar ao aspecto fixo. o restante é transparente
  • redraw // mudança de redesenho nos limites (chama -setNeedsDisplay)
  • center// o conteúdo permanece do mesmo tamanho. posicionado ajustado.
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight
Jonas Deichelmann
fonte
12

Resposta atualizada

Quando eu originalmente respondi a essa pergunta em 2014, não havia nenhum requisito para não aumentar a imagem no caso de uma imagem pequena. (A pergunta foi editada em 2015. ) Se você tiver esse requisito, será necessário comparar o tamanho da imagem com o do imageView e usá-lo UIViewContentModeCenter(no caso de uma imagem menor que o imageView) ou UIViewContentModeScaleAspectFitem todos os outros casos. .

Resposta original

Definir o contentMode do imageView como UIViewContentModeScaleAspectFitsuficiente para mim. Parece centralizar as imagens também. Não sei por que outras pessoas estão usando a lógica com base na imagem. Veja também esta pergunta: aspecto do iOS ajustado e centralizado

Nate Cook
fonte
1
Isso explode a imagem se ela for menor que a visualização da imagem, ao contrário do que o OP solicitou.
fishinear perto de 15/0918
1
@fishinear A exigência de não escalar a imagem para cima foi adicionado à pergunta de um ano depois eu respondi: stackoverflow.com/posts/15499376/revisions
Nate Cozinhe
10

Eu resolvi esse problema assim.

  1. setImage para UIImageView(com UIViewContentModeScaleAspectFit)
  2. obter imageSize (CGSize imageSize = imageView.image.size)
  3. UIImageView redimensionar. [imageView sizeThatFits:imageSize]
  4. mova a posição onde quiser.

Eu queria colocar o UIView no centro superior de UICollectionViewCell. então, eu usei essa função.

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

Funciona para mim.

Nicejinux
fonte
8

Essa subclasse usa o centro se a imagem não for maior que a vista, caso contrário, ela será reduzida. Achei isso útil para um UIImageViewque muda o tamanho.

A imagem exibida é menor que a vista para tamanhos grandes, mas maior que a vista para tamanhos pequenos. Eu quero apenas diminuir, mas não aumentar.

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
fonte
8

Você pode conseguir isso definindo o modo de conteúdo da exibição de imagem como UIViewContentModeScaleAspectFill.

Em seguida, use o método a seguir para obter o objeto de imagem de redimensionamento 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 aqui (versão rápida)

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
fonte
7
[your_imageview setContentMode:UIViewContentModeCenter];
souvickcse
fonte
17
Isso irá ignorar a escala
Skrew
2
Não sei por que soluções como essa receberam tantos votos positivos. Essa pessoa claramente não leu a pergunta.
lento
7
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);
Antony Ouseph
fonte
Isso explode a imagem se ela for menor que a visualização da imagem, ao contrário do que o OP solicitou.
fishinear perto de 15/0918
2

Para pessoas que procuram redimensionar o 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
fonte