Как пропорционально масштабировать UIImageView? - PullRequest
336 голосов
/ 09 октября 2008

У меня есть 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 и как мне исправить положение?

Ответы [ 17 ]

538 голосов
/ 20 февраля 2010

Исправлено легко, как только я нашел документацию!

 imageView.contentMode = UIViewContentModeScaleAspectFit;
395 голосов
/ 08 января 2013

Я немного поговорил о типах масштабирования, поэтому решил собрать статью , касающуюся некоторых наиболее популярных типов масштабирования в режиме контента .

.

Соответствующее изображение здесь:

enter image description here

78 голосов
/ 11 февраля 2009

Я только что попробовал это, и UIImage не поддерживает _imageScaledToSize.

Я закончил тем, что добавил метод в UIImage, используя категорию - предложение, которое я нашел на форумах Apple Dev.

В рамках всего проекта .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;
38 голосов
/ 11 декабря 2012
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.clipsToBounds = YES;
30 голосов
/ 09 октября 2008

Вы можете попробовать сделать размер 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;
13 голосов
/ 15 июня 2011
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 и указание всех значений top, left, width и height было самым простым способом отрегулировать положение в моем случае, который использовал UIImageView внутри ячейки таблицы. (Еще нужно добавить код для освобождения объектов)

12 голосов
/ 03 апреля 2015

Установите ваш ImageView, выбрав Mode на Aspect Fill и отметьте поле Clip Subviews.

enter image description here

12 голосов
/ 25 мая 2011

можно изменить размер UIImage таким образом

image = [UIImage imageWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];
8 голосов
/ 07 октября 2016

Это прекрасно работает для меня Swift 2.x:

imageView.contentMode = .ScaleAspectFill
imageView.clipsToBounds = true;
6 голосов
/ 17 сентября 2015

Для Свифта:

self.imageViews.contentMode = UIViewContentMode.ScaleToFill
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...