มุมมอง 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 อาจจะสั้นกว่า แต่ก็ไม่สามารถอ่านได้ ในเวลาเดียวกันผมเสนอให้แยกสอดคล้องกับคำสั่ง if เช่นนี้CGSize imageSize = ((UIImage*)imagesArray[i]).size;, ,CGSize viewSize = imageView.bounds.size if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {
Timur Bernikovich

1
ควรเป็น UIViewContentModeScaleAspectFit
NoelHunter

imageView.contentMode = UIViewContentModeScaleAspectFit;
Arjay Waran

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 // วาดใหม่เมื่อมีการเปลี่ยนแปลงขอบเขต (การเรียก -setNeedsDisplay)
  • center// เนื้อหายังคงมีขนาดเท่าเดิม ปรับตำแหน่ง
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight

12

อัปเดตคำตอบ

เมื่อตอนแรกที่ฉันตอบคำถามนี้ในปี 2014 ไม่มีความต้องการที่จะไม่ขยายขนาดภาพในกรณีของภาพขนาดเล็ก (คำถามถูกแก้ไขในปี 2558 ) หากคุณมีข้อกำหนดดังกล่าวคุณจะต้องเปรียบเทียบขนาดของรูปภาพกับขนาดของ imageView และใช้อย่างใดอย่างหนึ่งUIViewContentModeCenter(ในกรณีของภาพที่เล็กกว่า imageView) หรือUIViewContentModeScaleAspectFitในกรณีอื่น ๆ ทั้งหมด .

คำตอบเดิม

การตั้งค่า contentMode ของ imageView UIViewContentModeScaleAspectFitเป็นเพียงพอสำหรับฉัน ดูเหมือนว่าจะอยู่ตรงกลางของภาพเช่นกัน ฉันไม่แน่ใจว่าทำไมคนอื่นใช้ตรรกะตามภาพ ดูเพิ่มเติมที่คำถามนี้: ขนาดของiOS ที่พอดีและอยู่ตรงกลาง


1
การทำเช่นนี้จะเป็นการระเบิดรูปภาพถ้ามันมีขนาดเล็กกว่ามุมมองภาพซึ่งตรงกันข้ามกับสิ่งที่ OP ร้องขอ
fishinear

1
@fishinear ข้อกำหนดเกี่ยวกับการไม่ปรับขนาดรูปภาพถูกเพิ่มเข้าไปในคำถามหนึ่งปีหลังจากที่ฉันตอบ: stackoverflow.com/posts/15499376/revisions
Nate Cook

10

ฉันแก้ไขปัญหานี้เช่นนี้

  1. setImage ถึงUIImageView(พร้อมUIViewContentModeScaleAspectFit)
  2. รับ imageSize (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.