UIImageView görünüm sığdırma ve merkezleme


183

Programlı olarak bildirilen bir görüntü görünümüm var ve görüntüsünü de programlı olarak ayarlıyorum.

Ancak, kendimi görüntüyü hem en boy oranına sığacak şekilde ayarlayamadım hem de merkezi görüntü görünümüyle hizalayamadım.

Başka bir deyişle, görüntünün:

  • Görüntü büyükse, boyuta sığacak şekilde ölçeklendirin.
  • Görüntü küçükse ortalayın, ölçeklendirmeyin.

Bunu nasıl alabilirim?


19
[yourImageView setContentMode: UIViewContentModeCenter]; ve imageView Frame'in resim çerçevesinden büyük olduğundan emin olun. değilse, [yourImageView setContentMode: UIViewContentModeAspectToFit] öğesini yerleştirin;
Manohar Perepa

1
if else condition dude @RyanPoolos
Manohar Perepa

Yanıtlar:


205

Sadece çözümü yapıştırmak:

Tıpkı @manohar'ın dediği gibi

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

sorunumu çözdü


7
Resmi bulmanın daha kısa yolu daha küçüktür:CGRectContainsRect(imageView.bounds, {CGPointZero, image.size})
Cfr

@ CFr belki daha kısadır, ancak okunabilir değildir. Aynı zamanda böyle if deyiminin ile çizgiyi bölmek öneriyoruz: CGSize imageSize = ((UIImage*)imagesArray[i]).size;, CGSize viewSize = imageView.bounds.size, if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {.
Timur Bernikovich

1
Gerekir UIViewContentModeScaleAspectFit
NoelHunter

imageView.contentMode = UIViewContentModeScaleAspectFit;
Arjay Waran

75

Hızlı dilde UIImage görünümünün içerik modunu aşağıdaki gibi ayarlayabiliriz:

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

3
Bu, OP'nin istediklerinin aksine, görüntü görünümünden daha küçükse görüntüyü patlatır.
balıkgözü15

18

hızlı

yourImageView.contentMode = .center

Görüntünüzü konumlandırmak için aşağıdaki seçenekleri kullanabilirsiniz:

  • scaleToFill
  • scaleAspectFit // sabit boyuta sığacak şekilde ölçeklendirilmiş içerik. kalan şeffaf
  • redraw // sınır değişikliklerinde yeniden çiz (call -setNeedsDisplay)
  • center// içerik aynı boyutta kalır. ayarlanmış konumlandırılmış.
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight

12

Güncel cevap

Bu soruyu ilk olarak 2014 yılında yanıtladığımda, küçük bir görüntü durumunda görüntüyü büyütmemeye gerek yoktu. (Soru 2015 yılında düzenlenmiştir .) Böyle bir gereksiniminiz varsa, gerçekten de resmin boyutunu imageView ile karşılaştırmanız ve UIViewContentModeCenter(imageView'den daha küçük bir görüntüde) veya UIViewContentModeScaleAspectFitdiğer tüm durumlarda kullanmanız gerekir. .

Orijinal cevap

İmageView'ın contentMode ayarını yapmak UIViewContentModeScaleAspectFitbenim için yeterliydi. Görüntüleri de ortalıyor gibi görünüyor. Başkalarının neden resme dayalı mantığı kullandığından emin değilim. Ayrıca şu soruya bakın: iOS görünümüne uyum ve merkezleme


1
Bu, OP'nin istediklerinin aksine, görüntü görünümünden daha küçükse görüntüyü patlatır.
balıkgözü15

1
@fishinear Görüntüyü ölçeklendirmeme gereksinimi, yanıtladıktan bir yıl sonra soruya eklendi: stackoverflow.com/posts/15499376/revisions
Nate Cook

10

Bu sorunu böyle çözdüm.

  1. setImage UIImageView(ile UIViewContentModeScaleAspectFit)
  2. imageSize olsun (CGSize imageSize = imageView.image.size)
  3. UIImageView boyutlandırmak. [imageView sizeThatFits:imageSize]
  4. konumu istediğiniz yere taşıyın.

UIView'i en üst merkezine koymak istedim UICollectionViewCell. bu yüzden bu işlevi kullandım.

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

Benim için çalışıyor.


8

Bu alt sınıf, görüntü görünümden daha büyük değilse orta kullanır, aksi takdirde ölçeklenir. Ben UIImageViewboyutunu değiştiren bir için yararlı buldum .

Gösterdiği görüntü büyük boyutlar için görünümden daha küçük, ancak küçük boyutlar için görünümden daha büyük. Sadece küçülmesini istiyorum, ama yukarı değil.

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

Görüntü görünümü içerik modunu UIViewContentModeScaleAspectFill olarak ayarlayarak bunu başarabilirsiniz.

Sonra yeniden boyutlandırılmış uiimage nesnesini almak için aşağıdaki yöntem yöntemini kullanın.

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

Burada Düzenlendi (Hızlı Sürüm)

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
Bu, ölçeklendirmeyi görmezden gelecek
Skrew

2
Bunun gibi çözümlerin neden bu kadar çok oy aldığını bilmiyorum. Bu kişi soruyu hiç okumadı.
yavaşça

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

Bu, OP'nin istediklerinin aksine, görüntü görünümünden daha küçükse görüntüyü patlatır.
balıkgözü15

2

UIImage yeniden boyutlandırmasını arayan kullanıcılar için,

@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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.