UIImageView 가로 세로 맞춤


183

프로그래밍 방식으로 선언 된 이미지보기가 있으며 이미지를 프로그래밍 방식으로 설정하고 있습니다.

그러나 이미지를 가로 세로에 맞추고 이미지를 중앙에 맞추도록 이미지를 설정할 수 없습니다.

다시 말해, 나는 이미지가 다음과 같이되기를 원한다.

  • 이미지가 큰 경우 가로 세로 비율로 맞 춥니 다.
  • 이미지가 작은 경우 가운데로 확대하지 않습니다.

어떻게 구할 수 있습니까?


19
[yourImageView setContentMode : UIViewContentModeCenter]; imageView Frame이 이미지 프레임보다 큰지 확인하십시오. 그렇지 않으면 [yourImageView setContentMode : UIViewContentModeAspectToFit];
Manohar Perepa

1
그렇지 않으면 조건 친구 @RyanPoolos
Manohar Perepa

답변:


205

솔루션을 붙여 넣기 만하면됩니다.

@manohar가 말한 것처럼

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

내 문제를 해결했다


7
이미지를 찾는 짧은 방법은 더 작습니다.CGRectContainsRect(imageView.bounds, {CGPointZero, image.size})
Cfr

@Cfr 아마도 짧지 만 읽을 수는 없습니다. 동시에 나는이 같은 경우 문으로 라인을 분할 제안 : CGSize imageSize = ((UIImage*)imagesArray[i]).size;, CGSize viewSize = imageView.bounds.size, if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {.
Timur Bernikovich

1
UIViewContentModeScaleAspectFit
이어야 함

imageView.contentMode = UIViewContentModeScaleAspectFit;
Arjay Waran 2016 년

75

빠른 언어에서는 다음과 같이 UIImage보기의 컨텐츠 모드를 설정할 수 있습니다.

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

3
이것은 OP가 요청한 것과 반대로 이미지가 이미지보기보다 작 으면 이미지를 폭파시킵니다.
fishinear

18

빠른

yourImageView.contentMode = .center

다음 옵션을 사용하여 이미지를 배치 할 수 있습니다.

  • scaleToFill
  • scaleAspectFit // 내용이 고정 된 화면에 맞게 조정되었습니다. 나머지는 투명하다
  • redraw // 범위 변경시 다시 그리기 (calls -setNeedsDisplay)
  • center// 내용은 같은 크기로 유지됩니다. 위치 조정.
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight

12

업데이트 된 답변

2014 년에이 질문에 처음 대답했을 때 작은 이미지의 경우 이미지를 확대하지 않아도됩니다. (질문은 2015 년편집되었습니다 .) 그러한 요구 사항이있는 경우 실제로 이미지의 크기를 imageView의 크기와 비교하고 UIViewContentModeCenter(imageView보다 작은 이미지의 경우) 또는 UIViewContentModeScaleAspectFit다른 모든 경우를 사용해야합니다. .

원래 답변

imageView의 contentMode를 설정하는 UIViewContentModeScaleAspectFit것으로 충분했습니다. 이미지도 중앙에있는 것 같습니다. 왜 다른 사람들이 이미지를 기반으로 논리를 사용하는지 잘 모르겠습니다. 이 질문도 참조하십시오 : iOS aspect fit and center


1
이것은 OP가 요청한 것과 반대로 이미지가 이미지보기보다 작 으면 이미지를 폭파시킵니다.
fishinear

1
: 내가 대답 년 후 질문에 추가 된 이미지 업 스케일링하지에 대한 요구 사항을 @fishinear stackoverflow.com/posts/15499376/revisions
네이트 쿡

10

이 문제를 이렇게 해결했습니다.

  1. 행 setImage UIImageView(함께 UIViewContentModeScaleAspectFit)
  2. 이미지 얻기 (CGSize imageSize = imageView.image.size)
  3. UIImageView 크기를 조정하십시오. [imageView sizeThatFits:imageSize]
  4. 원하는 위치로 이동하십시오.

UIView를의 상단 중앙에 배치하고 싶었습니다 UICollectionViewCell. 그래서이 기능을 사용했습니다.

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

그것은 나를 위해 작동합니다.


8

이 서브 클래스는 이미지가 뷰보다 크지 않으면 가운데를 사용하고 그렇지 않으면 축소됩니다. 나는 이것이 유용한 것을 발견했다.UIImageView크기를 변경하는 .

표시되는 이미지는 큰 크기의보기보다 작지만 작은 크기의보기보다 큽니다. 규모 만 축소하고 싶지는 않습니다.

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

이미지보기의 컨텐츠 모드를 UIViewContentModeScaleAspectFill로 설정하여이를 달성 할 수 있습니다.

그런 다음 다음 메소드 메소드를 사용하여 크기가 조정 된 uiimage 객체를 가져 오십시오.

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

여기에서 편집 (Swift 버전)

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
이것은 스케일링을 무시할 것이다
Skrew

2
왜 이와 같은 솔루션이 많은 투표를 받았는지 모르겠습니다. 이 사람은 질문을 전혀 읽지 않았습니다.
느린

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

이것은 OP가 요청한 것과 반대로 이미지가 이미지보기보다 작 으면 이미지를 폭파시킵니다.
fishinear

2

UIImage 크기 조정을 원하는 사람들에게는

@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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.