Làm thế nào để chia tỷ lệ một UIImageView theo tỷ lệ?


341

Tôi có một UIImageView và mục tiêu là thu nhỏ nó theo tỷ lệ bằng cách cho nó chiều cao hoặc chiều rộng.

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;

Hình ảnh đã được thay đổi kích thước nhưng vị trí không nằm ở trên cùng bên trái. Cách tiếp cận tốt nhất để nhân rộng hình ảnh / imageView và làm cách nào để sửa vị trí?


Tôi có một cái gì đó tương tự như mã của bạn không hoạt động với tôi "UIImage * image = [UIImage imageNamed: imageString]; UIImageView * imageView = [[UIImage alloc] initWithImage: image];" trows một ngoại lệ có thể tiêu diệt ứng dụng của tôi whit này "Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSInvalidArgumentException', lý do: '- [UIImage initWithImage:]: chọn không được công nhận gửi đến dụ 0xd815930'"
Spire

3
@Spire Đó là UIImageView không phải UIImage ^^
Thomas Decaux

2
Điều này làm việc cho tôi. Hãy nhớ đặt .contentMode thành UIImageView của bạn - không phải UIImage của bạn. - Đây là của tôi: UIImageView * imageView = [[UIImageView alloc] initWithFrame: CGRectMake (0,0,30,30)]
Jarrett Barnett

Câu trả lời:


541

Dễ dàng sửa chữa, một khi tôi tìm thấy các tài liệu!

 imageView.contentMode = UIViewContentModeScaleAspectFit;

19
Bạn thực sự đã trả lời những gì? trong câu hỏi của Ronnie, anh ta đã đề cập rằng anh ta sử dụng nó
Dejell

3
ImageView của bạn có thể không được cắt. Hãy thử imageView.layer.masksToBound = CÓ;
mackworth

Lần đầu tiên tôi đã thử với IB để đảm bảo nó sẽ hoạt động khi cần, nhưng tôi không nhớ tên biến cần đặt. Vì vậy, tôi Google nó và tìm thấy câu trả lời này.
Dino Tw

1
Đối với bất kỳ ai có cùng một vấn đề trong Swift: ScaleAspectFitbây giờ là một enum UIViewContentMode, vì vậy bạn sẽ đặt imageView.contentMode = UIViewContentMode.ScaleAspectFit. Lưu ý thời gian.
sudo thực hiện cài đặt

1
translatesAutoresizingMaskIntoConstraintskhông nên được đặt thành false. Mất một thời gian dài trước khi nhận ra rằng tài sản này đang ngăn chặn việc thay đổi kích thước
Gerald

401

Tôi đã thấy một chút cuộc trò chuyện về các loại tỷ lệ nên tôi quyết định tập hợp một bài viết liên quan đến một số loại tỷ lệ chế độ nội dung phổ biến nhất .

Hình ảnh liên quan ở đây:

nhập mô tả hình ảnh ở đây


Làm thế nào để bạn căn chỉnh verticallu khi AspectFit được đặt?
esbenr

@esbenr Điều đó sẽ tự động xảy ra. Bạn có thể tìm thấy ghi đè khi cần nhưng hiện tại tôi không biết về ghi đè: |
Jacksonkr

Tôi muốn sử dụng Aspect Fill nhưng tôi cũng muốn hiển thị hình ảnh đầy đủ. Sau đó, tôi cần thay đổi kích thước 'Diện tích cho vừa'. Làm thế nào tôi có thể làm điều này với bố trí tự động?
lee

@lee Có một số tùy chọn nhưng nó thực sự phụ thuộc vào tình huống của bạn. Tôi đã tạo một cuộc trò chuyện SOF để chúng tôi có thể thảo luận về chủ đề của bạn và tôi sẽ cung cấp cho bạn thông tin tôi có, hãy tiếp tục nếu bạn quá thiên về: chat.stackoverflow.com/rooms/81180/ios-autoresize-chat
Jacksonkr

@Jackson Điều đó hoàn toàn không xảy ra. Nó chọn chiều cao của ảnh gốc trước khi UIImageView chia tỷ lệ cho nó, vì vậy chiều cao KHÔNG khớp với chiều cao Aspect Fited mới. Nếu bất cứ ai tìm ra một cách tốt đẹp để làm điều này, xin vui lòng cho tôi biết.
datWooWoo

78

Tôi mới thử cái này và UIImage không hỗ trợ _imageScaledToSize.

Cuối cùng tôi đã thêm một phương thức vào UIImage bằng một danh mục - một gợi ý tôi tìm thấy trên các diễn đàn Apple Dev.

Trong một dự án .h -

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

Thực hiện:

@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
thay vì UIGraphicsBeginImageContext(targetSize);làm nếu ([UIScreen instancesRespondToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0f); } else { UIGraphicsBeginImageContext(targetSize); }để hỗ trợ màn hình retina mà không làm cho nó bị mờ
xe đạp

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

30

Bạn có thể thử làm cho imageViewkích thước phù hợp với image. Các mã sau đây không được kiểm tra.

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
thiết lập imageView.frame = XXXX (bất cứ điều gì) không làm cho bất kỳ khác biệt nào với đầu ra. bất cứ ý tưởng tại sao?
sramij

1
@sramij Nếu bạn đang sử dụng tính năng tự động thanh toán, hãy đảm bảo gây rối với [setTranslatesAutoResize ...] trên UIViews. Nếu bạn không biết những gì mà kiểm tra tài liệu! :)
datWooWoo

13

người ta có thể thay đổi kích thước một UIImage theo cách này

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

Mã ban đầu được đăng ở đầu hoạt động tốt với tôi trong iOS 4.2.

Tôi thấy rằng việc tạo CGRect và chỉ định tất cả các giá trị trên cùng, bên trái, chiều rộng và chiều cao là cách dễ nhất để điều chỉnh vị trí trong trường hợp của tôi, đó là sử dụng UIImageView bên trong một ô của bảng. (Vẫn cần thêm mã để phát hành đối tượng)


13

Đặt ImageView của bạn bằng cách chọn Chế độ Aspect Fillvà chọn Clip Subviewshộp.

nhập mô tả hình ảnh ở đây


10

Điều này hoạt động tốt với tôi Swift 2.x:

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


6

Dành cho Swift:

self.imageViews.contentMode = UIViewContentMode.ScaleToFill

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

Tôi đã sử dụng đoạn mã sau đây. Ở đâu imageCoverView là UIView giữ 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

Nếu các giải pháp được đề xuất ở đây không hiệu quả với bạn và tài sản hình ảnh của bạn thực sự là PDF, hãy lưu ý rằng XCode thực sự xử lý các tệp PDF khác với các tệp hình ảnh. Cụ thể, dường như không thể chia tỷ lệ để điền đúng vào tệp PDF: thay vào đó, nó được xếp chồng lên nhau. Điều này khiến tôi phát điên cho đến khi tôi nhận ra rằng vấn đề là định dạng PDF. Chuyển đổi sang JPG và bạn nên đi.


1

Thông thường tôi sử dụng phương pháp này cho các ứng dụng của mình ( tương thích 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

Tôi nghĩ bạn có thể làm một cái gì đó như

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

3
Nó sẽ không mở rộng hình ảnh mà chỉ tập trung vào nó.
David Salzer

-3

Đây là cách bạn có thể mở rộng quy mô một cách dễ dàng.

Điều này hoạt động trong 2.x với Trình mô phỏng và iPhone.

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

xin chào, bạn có biết tham số interpolationQuality: không? cảm ơn
user102008

27
Đây là một phương pháp không có giấy tờ (gạch dưới là một tặng cho đã chết) có thể dẫn đến việc từ chối ứng dụng.
Ếch xù xì

Tham số nội suy chất lượng làm gì?
mấtInTransit
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.