UIImageViewを比例的にスケーリングする方法は?


341

私はUIImageViewを持っていて、その目的は、高さまたは幅のいずれかを指定することで比例的に縮小することです。

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;

画像はサイズ変更されましたが、位置は左上ではありません。image / imageViewをスケーリングするための最良のアプローチは何ですか?どのように位置を修正しますか?


「UIImage * image = [UIImage imageNamed:imageString]; UIImageView * imageView = [[UIImage alloc] initWithImage:image];」と機能しないコードに似たものがあります。「キャッチされていない例外 'NSInvalidArgumentException'によりアプリを終了しています。理由: '-[UIImage initWithImage:]:認識されないセレクターがインスタンス0xd815930'に送信されました」
尖塔

3
@SpireこれはUIImageではなくUIImageViewです^^
Thomas Decaux

2
これでうまくいきます。.contentModeを、UIImageではなくUIImageViewに設定することを忘れないでください。-これが私のものです:UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,30,30)]
Jarrett Barnett

回答:


541

ドキュメントを見つけたら、簡単に修正しました!

 imageView.contentMode = UIViewContentModeScaleAspectFit;

19
実際に何と答えましたか?ロニーの質問で、彼はそれを使用すると述べた
Dejell

3
imageViewがクリッピングされていない可能性があります。imageView.layer.masksToBounds = YESを試してください。
マックワース2014年

最初にIBを使用して必要に応じて機能することを確認しましたが、設定する変数名を覚えていません。だから私はそれをグーグルしてこの答えを見つけました。
Dino Tw 14

1
Swiftで同じ問題を抱えている人のために:ScaleAspectFitenum UIViewContentModeなので、を設定しimageView.contentMode = UIViewContentMode.ScaleAspectFitます。期間に注意してください。
sudo make install

1
translatesAutoresizingMaskIntoConstraintsに設定しないでくださいfalse。このプロパティがサイズ変更の妨げになっていることに気付くまでに長い時間かかりました
ジェラルド

401

スケールタイプについての会話を少し見てきたので、最も人気のあるコンテンツモードのスケーリングタイプに関する記事をまとめることにしました。

関連する画像はここにあります:

ここに画像の説明を入力してください


AspectFitが設定されている場合、どのように垂直方向に整列しますか?
esbenr 2013

@esbenrこれは自動的に行われるはずです。必要に応じてオーバーライドを見つけることができるかもしれませんが、現在はわかりません:|
Jacksonkr 2013

アスペクトフィルを使用したいが、画像全体を表示したい。次に、「Area to fit」サイズを変更する必要があります。自動レイアウトでこれを行うにはどうすればよいですか?
リー

@leeいくつかのオプションがありますが、それは本当にあなたの状況に依存しています。私はSOFチャットを作成したので、あなたのトピックについて話し合うことができます。私が持っている必要な情報をお伝えします。もし気が向い
ジャクソンクル

@Jacksonそれは自動的には起こりません。UIImageViewが拡大縮小する前に元の画像の高さを選択するため、高さは新しいアスペクトフィットの高さと一致しません。誰かがこれを行う良い方法を見つけたら、知らせてください。
datWooWoo 2015年

78

私はこれを試したところ、UIImageは_imageScaledToSizeをサポートしていません。

最終的に、カテゴリを使用してUIImageにメソッドを追加することになりました-Apple Devフォーラムで見つけた提案。

プロジェクト全体の.h-

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

実装:

@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
網膜ディスプレイをぼやけさせることなくサポートするUIGraphicsBeginImageContext(targetSize);場合は、代わりに([UIScreen instancesRespondToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0f); } else { UIGraphicsBeginImageContext(targetSize); }
自転車に乗ってください


30

imageViewサイズをに合わせてみてくださいimage。次のコードはテストされていません。

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(何でも)を設定しても、出力は変わりません。なぜか?
sramij 14

1
@sramij autolayoutを使用している場合は、UIViewsの[setTranslatesAutoResize ...]をいじってください。それが何であるかわからない場合は、ドキュメントを確認してください!:)
datWooWoo 2015年

13

この方法でUIImageのサイズを変更できます

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

上部に投稿された元のコードは、iOS 4.2ではうまく機能しました。

CGRectを作成し、上、左、幅、高さのすべての値を指定することが、テーブルセル内のUIImageViewを使用する場合に、位置を調整する最も簡単な方法であることがわかりました。(それでもオブジェクトを解放するコードを追加する必要があります)



10

これは私にとってはうまくいきますSwift 2.x:

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



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

私は次のコードを使用しました。imageCoverViewはUIViewで、UIImageViewを保持しています

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

ここで提案されたソリューションが機能せず、画像アセットが実際にはPDFである場合、XCodeは実際にはPDFを画像ファイルとは異なる方法で処理することに注意してください。特に、PDFで適切に埋めるように拡大縮小できないようです。代わりにタイル表示されます。問題がPDF形式であることを理解するまで、これは私を夢中にさせました。JPGに変換すれば問題ありません。


1

通常、私は自分のアプリにこの方法を使用しています(Swift 2.x互換):

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

あなたは次のようなことができると思います

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

3
画像は拡大縮小されず、中央に配置されます。
David Salzer、2011

-3

これは、簡単にスケーリングする方法です。

これは、シミュレーターとiPhoneを備えた2.xで機能します。

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

こんにちは、interpolationQuality:パラメータの機能を知っていますか?ありがとう
user102008 2009

27
これは、文書化されていない方法であり(アンダースコアは完全なプレゼントです)、アプリが拒否される可能性があります。
シャギーカエル

InterpolationQualityパラメータは何をしますか?
lostInTransit 2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.