UIImageView phù hợp với khía cạnh và trung tâm


183

Tôi có chế độ xem hình ảnh, được khai báo theo chương trình và tôi đang thiết lập hình ảnh của nó, cũng lập trình.

Tuy nhiên, tôi thấy mình không thể thiết lập hình ảnh vừa phù hợp với khía cạnh và căn chỉnh trung tâm với chế độ xem hình ảnh.

Nói cách khác, tôi muốn hình ảnh:

  • Thu nhỏ xuống để phù hợp với khía cạnh, nếu hình ảnh lớn.
  • Trung tâm nhưng không mở rộng quy mô, nếu hình ảnh nhỏ.

Làm thế nào để tôi có được điều đó?


19
[yourImageView setContentMode: UIViewContentModeCenter]; và đảm bảo nếu imageView Frame lớn hơn khung hình. nếu không thì đặt [yourImageView setContentMode: UIViewContentModeAspectToFit];
Manohar Perepa

1
nếu điều kiện khác anh chàng @RyanPoolos
Manohar Perepa

Câu trả lời:


205

Chỉ cần dán giải pháp:

Giống như @manohar đã nói

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

giải quyết vấn đề của tôi


7
Cách ngắn hơn để tìm ra hình ảnh nhỏ hơn:CGRectContainsRect(imageView.bounds, {CGPointZero, image.size})
Cfr

@Cfr có thể ngắn hơn, nhưng không dễ đọc. Đồng thời tôi đề nghị chia phù hợp với lệnh if-như thế này: CGSize imageSize = ((UIImage*)imagesArray[i]).size;, CGSize viewSize = imageView.bounds.size, if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {.
Timur Bernikovich

1
Nên là UIViewContentModeScaleAspectFit
NoelHunter

imageView.contentMode = UIViewContentModeScaleAspectFit;
Arjay Waran

75

Trong ngôn ngữ nhanh, chúng ta có thể đặt chế độ nội dung của chế độ xem UIImage như sau:

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

3
Điều này làm nổ hình ảnh nếu nó nhỏ hơn chế độ xem hình ảnh, trái với những gì OP yêu cầu.
câu cá

18

Nhanh

yourImageView.contentMode = .center

Bạn có thể sử dụng các tùy chọn sau để định vị hình ảnh của mình:

  • scaleToFill
  • scaleAspectFit // nội dung được chia tỷ lệ để phù hợp với khía cạnh cố định. phần còn lại là minh bạch
  • redraw // vẽ lại thay đổi giới hạn (gọi -setNeedsDisplay)
  • center// nội dung vẫn giữ nguyên kích thước. Định vị điều chỉnh.
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight

12

Cập nhật câu trả lời

Khi tôi trả lời ban đầu câu hỏi này vào năm 2014, không có yêu cầu không mở rộng hình ảnh trong trường hợp hình ảnh nhỏ. (Câu hỏi đã được chỉnh sửa vào năm 2015. ) Nếu bạn có yêu cầu như vậy, bạn thực sự sẽ cần so sánh kích thước của hình ảnh với kích thước của imageView và sử dụng UIViewContentModeCenter(trong trường hợp hình ảnh nhỏ hơn imageView) hoặcUIViewContentModeScaleAspectFit trong tất cả các trường hợp khác .

Câu trả lời gốc

Đặt nội dung của imageView UIViewContentModeScaleAspectFitlà đủ cho tôi. Nó dường như tập trung vào hình ảnh là tốt. Tôi không chắc tại sao những người khác sử dụng logic dựa trên hình ảnh. Xem thêm câu hỏi này: sự phù hợp và trung tâm của iOS


1
Điều này làm nổ hình ảnh nếu nó nhỏ hơn chế độ xem hình ảnh, trái với những gì OP yêu cầu.
câu cá

1
@fishinear Yêu cầu về không tăng tỷ lệ hình ảnh đã được thêm vào câu hỏi một năm sau khi tôi trả lời: stackoverflow.com/posts/15499376/revutions
Nate Cook

10

Tôi đã giải quyết vấn đề như thế này.

  1. setImage thành UIImageView(vớiUIViewContentModeScaleAspectFit )
  2. lấy kích thước hình ảnh (CGSize imageSize = imageView.image.size)
  3. UIImageView thay đổi kích thước [imageView sizeThatFits:imageSize]
  4. di chuyển vị trí mà bạn muốn.

Tôi muốn đặt UIView vào trung tâm hàng đầu của UICollectionViewCell. Vì vậy, tôi đã sử dụng chức năng này.

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

Nó làm việc cho tôi.


8

Lớp con này sử dụng trung tâm nếu hình ảnh không lớn hơn chế độ xem, nếu không nó sẽ giảm xuống. Tôi thấy điều này hữu ích cho mộtUIImageView việc thay đổi kích thước.

Hình ảnh nó hiển thị nhỏ hơn chế độ xem cho kích thước lớn, nhưng lớn hơn chế độ xem cho kích thước nhỏ. Tôi muốn nó chỉ giảm quy mô, nhưng không lên.

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

Bạn có thể đạt được điều này bằng cách đặt chế độ nội dung của chế độ xem hình ảnh thành UIViewContentModeScaleAspectFill.

Sau đó sử dụng phương thức phương pháp sau để có được đối tượng uiimage đã thay đổi kích thước.

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

Đã chỉnh sửa tại đây (Phiên bản 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
Điều này sẽ bỏ qua việc chia tỷ lệ
Skrew

2
Tôi không biết tại sao các giải pháp như thế này lại có rất nhiều sự ủng hộ. Người này rõ ràng không đọc câu hỏi nào cả.
chậm

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

Điều này làm nổ hình ảnh nếu nó nhỏ hơn chế độ xem hình ảnh, trái với những gì OP yêu cầu.
câu cá

2

Đối với những người tìm kiếm thay đổi kích thước 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.