UIImageView Aspekt passen und zentrieren

181

Ich habe eine Bildansicht, die programmgesteuert deklariert wurde, und ich setze ihr Bild auch programmgesteuert.

Ich kann das Bild jedoch nicht so einstellen, dass es sowohl zum Aspekt passt als auch die Mitte an der Bildansicht ausrichtet.

Mit anderen Worten, ich möchte, dass das Bild:

  • Skalieren Sie, um dem Aspekt zu entsprechen, wenn das Bild groß ist.
  • Zentrieren, aber nicht vergrößern, wenn das Bild klein ist.

Wie bekomme ich das?

Ravi Vooda
quelle
19
[yourImageView setContentMode: UIViewContentModeCenter]; und stellen Sie sicher, dass imageView Frame größer als imageframe ist. Wenn dies nicht der Fall ist, platzieren Sie [yourImageView setContentMode: UIViewContentModeAspectToFit];
Manohar Perepa
1
wenn sonst Bedingung Kumpel @RyanPoolos
Manohar Perepa

Antworten:

204

Einfach die Lösung einfügen:

Genau wie @manohar sagte

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

löste mein Problem

Ravi Vooda
quelle
7
Der kürzere Weg, um das Bild herauszufinden, ist kleiner:CGRectContainsRect(imageView.bounds, {CGPointZero, image.size})
Vgl.
@Cfr vielleicht ist es kürzer, aber nicht so lesbar. Zugleich schlage ich Linie aufzuspalten mit if-Anweisung wie folgt: CGSize imageSize = ((UIImage*)imagesArray[i]).size;, CGSize viewSize = imageView.bounds.size, if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {.
Timur Bernikovich
1
Sollte UIViewContentModeScaleAspectFit
NoelHunter
imageView.contentMode = UIViewContentModeScaleAspectFit;
Arjay Waran
74

In der schnellen Sprache können wir den Inhaltsmodus der UIImage-Ansicht wie folgt einstellen:

let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit
Ali Raza
quelle
2
Dies sprengt das Bild, wenn es kleiner als die Bildansicht ist, im Gegensatz zu dem, was das OP verlangt hat.
fishinear
16

Schnell

yourImageView.contentMode = .center

Sie können die folgenden Optionen verwenden, um Ihr Bild zu positionieren:

  • scaleToFill
  • scaleAspectFit // Inhalt skaliert, um mit festem Aspekt zu passen. Der Rest ist transparent
  • redraw // bei Grenzänderungen neu zeichnen (ruft -setNeedsDisplay auf)
  • center// Inhalt bleibt gleich groß. positioniert eingestellt.
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight
Jonas Deichelmann
quelle
12

Antwort aktualisiert

Als ich diese Frage ursprünglich im Jahr 2014 beantwortete, war es nicht erforderlich, das Bild bei einem kleinen Bild nicht zu vergrößern. (Die Frage wurde 2015 bearbeitet .) Wenn Sie eine solche Anforderung haben, müssen Sie tatsächlich die Größe des Bildes mit der der imageView vergleichen und entweder UIViewContentModeCenter(im Fall eines Bildes, das kleiner als die imageView ist) oder UIViewContentModeScaleAspectFitin allen anderen Fällen verwenden .

Ursprüngliche Antwort

Es hat mir gereicht, den contentMode von imageView auf UIViewContentModeScaleAspectFitzu setzen. Es scheint auch die Bilder zu zentrieren. Ich bin mir nicht sicher, warum andere Logik verwenden, die auf dem Bild basiert. Siehe auch diese Frage: iOS-Aspekt passt und zentriert

Nate Cook
quelle
1
Dies sprengt das Bild, wenn es kleiner als die Bildansicht ist, im Gegensatz zu dem, was das OP verlangt hat.
fishinear
1
@fishinear Die Anforderung, das Bild nicht zu vergrößern, wurde der Frage ein Jahr nach meiner Beantwortung hinzugefügt: stackoverflow.com/posts/15499376/revisions
Nate Cook
10

Ich habe dieses Problem so gelöst.

  1. setImage auf UIImageView(mit UIViewContentModeScaleAspectFit)
  2. Holen Sie sich imageSize (CGSize imageSize = imageView.image.size)
  3. UIImageView Größe ändern. [imageView sizeThatFits:imageSize]
  4. Bewegen Sie die Position, wo Sie möchten.

Ich wollte UIView in die obere Mitte von setzen UICollectionViewCell. Also habe ich diese Funktion benutzt.

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

Für mich geht das.

Nicejinux
quelle
8

Diese Unterklasse verwendet die Mitte, wenn das Bild nicht größer als die Ansicht ist, andernfalls wird es verkleinert. Ich fand das nützlich für eine UIImageView, die die Größe ändert.

Das angezeigte Bild ist kleiner als die Ansicht für große Größen, aber größer als die Ansicht für kleine Größen. Ich möchte, dass es nur verkleinert, aber nicht vergrößert wird.

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

Sie können dies erreichen, indem Sie den Inhaltsmodus der Bildansicht auf UIViewContentModeScaleAspectFill setzen.

Verwenden Sie dann die folgende Methode, um das Uiimage-Objekt mit geänderter Größe abzurufen.

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

Hier bearbeitet (Swift Version)

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
quelle
7
[your_imageview setContentMode:UIViewContentModeCenter];
souvickcse
quelle
17
Dies wird die Skalierung ignorieren
Skrew
1
Ich weiß nicht, warum solche Lösungen so viele positive Stimmen bekommen haben. Diese Person hat die Frage offensichtlich überhaupt nicht gelesen.
langsam
7
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);
Antony Ouseph
quelle
Dies sprengt das Bild, wenn es kleiner als die Bildansicht ist, im Gegensatz zu dem, was das OP verlangt hat.
fishinear
2

Für Leute, die nach UIImage-Größenänderung suchen,

@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
quelle