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'으로 전송 됨"
Spire

3
@Spire 그것은 UIImage가 아닌 UIImageView입니다 ^^
Thomas Decaux

2
이것은 나를 위해 작동합니다. UIImage가 아닌 .contentMode를 UIImageView로 설정해야합니다. - 여기 내이다 : 이미지 뷰의 UIImageView * = [UIImageView에 ALLOC] initWithFrame : CGRectMake (0,0,30,30)]
자렛 바네트

답변:


541

설명서를 찾은 후 쉽게 수정했습니다!

 imageView.contentMode = UIViewContentModeScaleAspectFit;

19
실제로 무엇에 대답 했습니까? 로니의 질문에서 그는 그것을 사용한다고 언급했다
Dejell

3
imageView가 잘리지 않을 수 있습니다. imageView.layer.masksToBounds = YES를 시도하십시오.
mackworth

먼저 IB를 사용하여 필요에 따라 작동하는지 확인했지만 설정할 변수 이름을 기억하지 못합니다. 그래서 나는 그것을 구글 하고이 대답을 찾았습니다.
Dino Tw

1
Swift :에서 같은 문제가있는 사람 ScaleAspectFit은 이제 enum UIViewContentMode입니다 imageView.contentMode = UIViewContentMode.ScaleAspectFit. 기간에 유의하십시오.
sudo

1
translatesAutoresizingMaskIntoConstraints로 설정하지 않아야합니다 false. 이 부동산이 크기 조정을 방해하고 있음을 깨닫기까지 오랜 시간이
Gerald

401

스케일 유형에 대한 약간의 대화를 보았으므로 가장 인기있는 콘텐츠 모드 스케일링 유형에 관한 기사 를 작성하기로 결정했습니다 .

관련 이미지는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


AspectFit을 설정할 때 어떻게 수직 정렬을합니까?
esbenr

@esbenr 자동으로 발생합니다. 필요에 따라 재정의를 찾을 수는 있지만 현재 잘 모르겠습니다. |
Jacksonkr

Aspect Fill을 사용하고 싶지만 전체 이미지를 표시하고 싶습니다. 그런 다음 'Area to fit'크기를 변경해야합니다. 자동 레이아웃으로 어떻게 할 수 있습니까?
lee

@lee 많은 옵션이 있지만 상황에 따라 다릅니다. 우리는 당신의 주제를 논의 할 수 있도록 내가 SOF 채팅을 만든 당신이 그렇게 경사하는 경우 나 이상에, 당신은 내가 가지고있는 정보를 원하는 머리를주지 : chat.stackoverflow.com/rooms/81180/ios-autoresize-chat를
Jacksonkr

@Jackson 전혀 자동으로 발생하지 않습니다. UIImageView가 크기를 조정하기 전에 원본 이미지의 높이를 선택하므로 높이가 새로운 Aspect Fitted 높이와 일치하지 않습니다. 아무도 이것을 할 수있는 좋은 방법을 찾으면 알려주십시오.
datWooWoo

78

방금 시도했지만 UIImage는 _imageScaledToSize를 지원하지 않습니다.

Apple Dev 포럼에서 찾은 제안 인 범주를 사용하여 UIImage에 메소드를 추가했습니다.

프로젝트 전체에서 .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); }
자전거

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

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 (anything) 설정은 출력과 다르지 않습니다. 왜 그런지 알아?
sramij

1
@sramij 자동 레이아웃을 사용하는 경우 UIView에서 [setTranslatesAutoResize ...]로 엉망이되도록하십시오. 그것이 무엇인지 모른다면 설명서를 확인하십시오! :)
datWooWoo

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를 사용하는 경우의 위치를 ​​조정하는 가장 쉬운 방법이라는 것을 알았습니다. (아직 객체를 해제하려면 코드를 추가해야합니다)


13

모드를 선택하여 ImageView를 설정 Aspect Fill하고 확인란 을 선택 하십시오 Clip Subviews.

여기에 이미지 설명을 입력하십시오


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

-3

다음은 쉽게 확장 할 수있는 방법입니다.

이것은 시뮬레이터와 iPhone에서 2.x에서 작동합니다.

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

안녕하세요, interpolationQuality : 매개 변수의 기능을 알고 있습니까? 감사
user102008

27
이것은 문서화되지 않은 방법이며 (밑줄은 치명적입니다) 앱 거부가 발생할 수 있습니다.
얽히고 설킨 개구리

interpolationQuality 매개 변수의 기능은 무엇입니까?
lostInTransit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.