Bir UIImageView orantılı olarak nasıl ölçeklendirilir?


341

Bir UIImageView var ve amaç, bir yükseklik veya genişlik vererek orantılı olarak ölçeklendirmektir.

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 

//Add image view
[self.view addSubview:imageView];   

//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;

//change width of frame
CGRect frame = imageView.frame;
frame.size.width = 100;
imageView.frame = frame;

Görüntü yeniden boyutlandırıldı ancak konum sol üstte değil. İmage / imageView ölçeklendirmek için en iyi yaklaşım nedir ve konumu nasıl düzeltirim?


Benim için çalışmayan kodunuza benzer bir şey var "UIImage * image = [UIImage imageNamed: imageString]; UIImageView * imageView = [[UIImage ayır] initWithImage: image];" "NSInvalidArgumentException" yakalanmamış istisnası nedeniyle uygulamayı sonlandırıyor, nedeni: '- [UIImage initWithImage:]: tanınmayan seçici 0xd815930 örneğine gönderildi "
Spire

3
@Ipire It's UIImageView değil UIImage ^^
Thomas Decaux

2
Bu benim için çalışıyor. .ContentMode öğesini UIImage değerinize değil UIImageView öğenize ayarlamayı unutmayın. - İşte benimki: UIImageView * imageView = [[UIImageView ayır] initWithFrame: CGRectMake (0,0,30,30)]
Jarrett Barnett

Yanıtlar:


541

Belgeleri bulduğumda kolayca düzeltildi!

 imageView.contentMode = UIViewContentModeScaleAspectFit;

19
Aslında ne cevapladın? Ronnie'nin sorusunda kullandığını söyledi
Dejell

3
İmageView öğeniz kırpılmıyor olabilir. İmageView.layer.masksToBounds = YES;
mackworth

Önce IB ile gerektiği gibi çalışacağından emin olmak için çalıştım, ancak ayarlanacak değişken adını hatırlamıyorum. Ben de Google'ı buldum ve bu cevabı buldum.
Dino Tw

1
Swift'te aynı sorunu olan herkes için: ScaleAspectFitşimdi bir enum UIViewContentMode, böylece ayarlayacaksınız imageView.contentMode = UIViewContentMode.ScaleAspectFit. Döneme dikkat edin.
sudo make install

1
translatesAutoresizingMaskIntoConstraintsolarak ayarlanmamalıdır false. Bu mülkün yeniden boyutlandırılmasını engellediğini fark etmeden önce uzun bir süre aldı
Gerald

401

Ölçek türleri hakkında biraz konuşma gördüm, bu yüzden en popüler içerik modu ölçeklendirme türleriyle ilgili bir makale hazırlamaya karar verdim .

İlişkili resim burada:

resim açıklamasını buraya girin


AspectFit ayarlandığında nasıl hizalanırsınız?
esbenr

@esbenr Bu otomatik olarak gerçekleşmelidir. Gerektiğinde bir geçersiz kılma bulabilirsiniz, ancak şu anda birini bilmiyorum: |
Jacksonkr

Aspect Fill kullanmak istiyorum ancak tam görüntüyü de göstermek istiyorum. Sonra 'Sığacak alanı' boyutunu değiştirmem gerekiyor. Bunu otomatik düzen ile nasıl yapabilirim?
lee

@lee Birkaç seçenek var ama durumunuza bağlı. Bir SOF sohbeti oluşturdum, böylece konunuzu tartışabiliriz ve size sahip olduğum bilgileri vereceğim, eğer bu kadar eğimli iseniz başınıza gidin
Jacksonkr

@ Jackson Bu otomatik olarak gerçekleşmez. UIImageView ölçeklendirmeden önce orijinal görüntünün yüksekliğini seçer, böylece yükseklik yeni Aspect Fitted yüksekliğiyle eşleşmez. Birisi bunu yapmanın güzel bir yolunu bulursa, lütfen bana bildirin.
datWooWoo

78

Ben sadece denedim ve UIImage _imageScaledToSize desteklemiyor.

Apple Dev forumlarında bulduğum bir öneriyle bir kategori kullanarak UIImage'a bir yöntem ekledim.

Proje çapında .h -

@interface UIImage (Extras)
- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
@end;

Uygulama:

@implementation UIImage (Extras)

- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize {

    UIImage *sourceImage = self;
    UIImage *newImage = nil;

    CGSize imageSize = sourceImage.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;

    CGFloat targetWidth = targetSize.width;
    CGFloat targetHeight = targetSize.height;

    CGFloat scaleFactor = 0.0;
    CGFloat scaledWidth = targetWidth;
    CGFloat scaledHeight = targetHeight;

    CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

    if (CGSizeEqualToSize(imageSize, targetSize) == NO) {

        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;

        if (widthFactor < heightFactor) 
            scaleFactor = widthFactor;
        else
            scaleFactor = heightFactor;

        scaledWidth  = width * scaleFactor;
        scaledHeight = height * scaleFactor;

        // center the image

        if (widthFactor < heightFactor) {
            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
        } else if (widthFactor > heightFactor) {
            thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
        }
    }


    // this is actually the interesting part:

    UIGraphicsBeginImageContext(targetSize);

    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.origin = thumbnailPoint;
    thumbnailRect.size.width  = scaledWidth;
    thumbnailRect.size.height = scaledHeight;

    [sourceImage drawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    if(newImage == nil) NSLog(@"could not scale image");


    return newImage ;
}

@end;

1
retina ekranları bulanıklaştırmadan desteklemek için UIGraphicsBeginImageContext(targetSize);yapmak yerine([UIScreen instancesRespondToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0f); } else { UIGraphicsBeginImageContext(targetSize); }
bisiklet

38
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.clipsToBounds = YES;

30

imageViewBoyutu eşleştirmeyi deneyebilirsiniz image. Aşağıdaki kod test edilmemiştir.

CGSize kMaxImageViewSize = {.width = 100, .height = 100};
CGSize imageSize = image.size;
CGFloat aspectRatio = imageSize.width / imageSize.height;
CGRect frame = imageView.frame;
if (kMaxImageViewSize.width / aspectRatio <= kMaxImageViewSize.height) 
{
    frame.size.width = kMaxImageViewSize.width;
    frame.size.height = frame.size.width / aspectRatio;
} 
else 
{
    frame.size.height = kMaxImageViewSize.height;
    frame.size.width = frame.size.height * aspectRatio;
}
imageView.frame = frame;

1
imageView.frame = XXXX (herhangi bir şey) ayarının çıktıdan farkı yoktur. neden herhangi bir fikir?
sramij

1
@sramij Otomatik yerleşim kullanıyorsanız, UIViews'deki [setTranslatesAutoResize ...] ile uğraştığınızdan emin olun. Bunun ne olduğunu bilmiyorsanız belgeleri kontrol edin! :)
datWooWoo

13

Bir kullanıcı arayüzü bu şekilde yeniden boyutlandırılabilir

image = [UIImage imageWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];

13
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 


//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;

//change width of frame
//CGRect frame = imageView.frame;
//frame.size.width = 100;
//imageView.frame = frame;

//original lines that deal with frame commented out, yo.
imageView.frame = CGRectMake(10, 20, 60, 60);

...

//Add image view
[myView addSubview:imageView]; 

En üstte yayınlanan orijinal kod, iOS 4.2'de benim için iyi çalıştı.

Bir CGRect oluşturma ve tüm üst, sol, genişlik ve yükseklik değerlerini belirtmek benim durumumda bir tablo hücresi içinde bir UIImageView kullanan konumu ayarlamak için en kolay yol olduğunu buldum. (Nesneleri serbest bırakmak için hala kod eklemeniz gerekir)


13

Mod'u seçerek ImageView'inizi ayarlayın Aspect Fillve Clip Subviewskutuyu işaretleyin.

resim açıklamasını buraya girin


10

Bu benim için işe yarıyor Swift 2.x:

imageView.contentMode = .ScaleAspectFill
imageView.clipsToBounds = true;


6

Swift için:

self.imageViews.contentMode = UIViewContentMode.ScaleToFill

5

UIImageView + Scale.h:

#import <Foundation/Foundation.h>

@interface UIImageView (Scale)

-(void) scaleAspectFit:(CGFloat) scaleFactor;

@end

UIImageView + Scale.m:

#import "UIImageView+Scale.h"

@implementation UIImageView (Scale)


-(void) scaleAspectFit:(CGFloat) scaleFactor{

    self.contentScaleFactor = scaleFactor;
    self.transform = CGAffineTransformMakeScale(scaleFactor, scaleFactor);

    CGRect newRect = self.frame;
    newRect.origin.x = 0;
    newRect.origin.y = 0;
    self.frame = newRect;
}

@end

2

Ben aşağıdaki code.where kullanılan imageCoverView UIView UIImageView tutar

if (image.size.height<self.imageCoverView.bounds.size.height && image.size.width<self.imageCoverView.bounds.size.width)
{
    [self.profileImageView sizeToFit];
    self.profileImageView.contentMode =UIViewContentModeCenter
}
else
{
    self.profileImageView.contentMode =UIViewContentModeScaleAspectFit;
}

2

Burada önerilen çözümler sizin için çalışmıyorsa ve görüntü öğeniz aslında bir PDF ise, XCode'un aslında PDF'leri görüntü dosyalarından farklı şekilde ele aldığını unutmayın. Özellikle, bir PDF ile düzgün doldurmak için ölçeklenemiyor gibi görünüyor: bunun yerine döşenir. Sorunun PDF formatı olduğunu anlayana kadar bu beni deli etti. JPG'ye dönüştürün ve gitmek için iyi olmalısınız.


1

Genellikle bu yöntemi uygulamalarım için kullanıyorum ( Swift 2.x uyumlu):

// Resize UIImage
func resizeImage(image:UIImage, scaleX:CGFloat,scaleY:CGFloat) ->UIImage {
    let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(scaleX, scaleY))
    let hasAlpha = true
    let scale: CGFloat = 0.0 // Automatically use scale factor of main screen

    UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
    image.drawInRect(CGRect(origin: CGPointZero, size: size))

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return scaledImage
}

0

Bence böyle bir şey yapabilirsin

image.center = [[imageView window] center];

3
Görüntüyü ölçeklemez, sadece ortalar.
David Salzer

-3

İşte bunu kolayca ölçeklendirebilirsiniz.

Bu, Simülatör ve iPhone ile 2.x'te çalışır.

UIImage *thumbnail = [originalImage _imageScaledToSize:CGSizeMake(40.0, 40.0) interpolationQuality:1];

merhaba, interpolationQuality: parametresinin ne yaptığını biliyor musunuz? teşekkürler
user102008

27
Bu, uygulama reddine neden olabilecek belgesiz bir yöntemdir (alt çizgi ölü bir hediyedir).
Shaggy Frog

İnterpolationQuality parametresi ne işe yarar?
lostInTransit
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.