UIImageView aspetto in forma e al centro


183

Ho una vista immagine, dichiarata a livello di codice, e sto impostando la sua immagine, anche a livello di codice.

Tuttavia, non riesco a impostare l'immagine per adattarla all'aspetto e allineare il centro alla vista dell'immagine.

In altre parole, voglio che l'immagine:

  • Ridimensiona per adattarsi all'aspetto, se l'immagine è grande.
  • Centra ma non ingrandisci, se l'immagine è piccola.

Come lo ottengo?


19
[yourImageView setContentMode: UIViewContentModeCenter]; e assicurati che imageView Frame sia maggiore della cornice dell'immagine. in caso contrario, inserisci [yourImageView setContentMode: UIViewContentModeAspectToFit];
Manohar Perepa,

1
se altrimenti condizione amico @RyanPoolos
Manohar Perepa

Risposte:


205

Basta incollare la soluzione:

Proprio come ha detto @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;
}

risolto il mio problema


7
Il modo più breve per scoprire l'immagine è più piccolo:CGRectContainsRect(imageView.bounds, {CGPointZero, image.size})
Cfr

@Cfr forse è più breve, ma non così leggibile. Allo stesso tempo, vi propongo di dividere linea con istruzione if-in questo modo: CGSize imageSize = ((UIImage*)imagesArray[i]).size;, CGSize viewSize = imageView.bounds.size, if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {.
Timur Bernikovich,

1
Dovrebbe essere UIViewContentModeScaleAspectFit
NoelHunter il

imageView.contentMode = UIViewContentModeScaleAspectFit;
Arjay Waran,

75

In un linguaggio rapido possiamo impostare la modalità contenuto della vista UIImage come la seguente:

let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit

3
Questo fa esplodere l'immagine se è più piccola della vista dell'immagine, contrariamente a quanto richiesto dall'OP.
fishinear dal

18

veloce

yourImageView.contentMode = .center

È possibile utilizzare le seguenti opzioni per posizionare l'immagine:

  • scaleToFill
  • scaleAspectFit // contenuto ridimensionato per adattarsi all'aspetto fisso. il resto è trasparente
  • redraw // modifica del ridisegno sui limiti (chiama -setNeedsDisplay)
  • center// il contenuto rimane della stessa dimensione. posizionato regolato.
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight

12

Risposta aggiornata

Quando avevo inizialmente risposto a questa domanda nel 2014, non era necessario non ingrandire l'immagine nel caso di un'immagine piccola. (La domanda è stata modificata nel 2015 ). Se si dispone di tale requisito, sarà effettivamente necessario confrontare la dimensione dell'immagine con quella di imageView e utilizzare UIViewContentModeCenter(nel caso di un'immagine più piccola di imageView) o UIViewContentModeScaleAspectFitin tutti gli altri casi .

Risposta originale

L'impostazione della modalità contenuto di imageView su è UIViewContentModeScaleAspectFitstata sufficiente per me. Sembra centrare anche le immagini. Non sono sicuro del motivo per cui altri stanno usando la logica basata sull'immagine. Vedi anche questa domanda: aspetto e centraggio dell'aspetto iOS


1
Questo fa esplodere l'immagine se è più piccola della vista dell'immagine, contrariamente a quanto richiesto dall'OP.
fishinear dal

1
@fishinear Il requisito di non ridimensionare l'immagine è stato aggiunto alla domanda un anno dopo aver risposto: stackoverflow.com/posts/15499376/revisions
Nate Cook

10

Ho risolto questo problema in questo modo.

  1. setImage su UIImageView(con UIViewContentModeScaleAspectFit)
  2. ottieni imageSize (CGSize imageSize = imageView.image.size)
  3. UIImageView ridimensionare. [imageView sizeThatFits:imageSize]
  4. sposta la posizione dove vuoi.

Volevo mettere UIView in alto al centro di UICollectionViewCell. quindi ho usato questa funzione.

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

Per me funziona.


8

Questa sottoclasse utilizza il centro se l'immagine non è più grande della vista, altrimenti si ridimensiona. Ho trovato questo utile per aUIImageView che cambia la dimensione.

L'immagine visualizzata è più piccola della vista per dimensioni grandi, ma più grande della vista per dimensioni ridotte. Voglio solo ridimensionarlo, ma non su.

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

8

È possibile ottenere ciò impostando la modalità contenuto della vista immagine su UIViewContentModeScaleAspectFill.

Quindi utilizzare il metodo seguente per ottenere l'oggetto uiimage ridimensionato.

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

Modificato qui (versione 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;
}

7
[your_imageview setContentMode:UIViewContentModeCenter];

17
Questo ignorerà il ridimensionamento
Skrew

2
Non so perché soluzioni come questa abbiano ottenuto così tanti voti positivi. Questa persona chiaramente non ha letto per niente la domanda.
lento

7
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);

Questo fa esplodere l'immagine se è più piccola della vista dell'immagine, contrariamente a quanto richiesto dall'OP.
fishinear

2

Per le persone che cercano il ridimensionamento di 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.