UIImageView: изменить размер изображения?

У меня есть UIImageView с режимом содержания Aspect Fit размером 220x155. Я динамически вставляю разные изображения в разных разрешениях, но все больше размера UIImageView. Поскольку для режима содержимого установлено значение Aspect Fit, изображение масштабируется относительно отношения, чтобы соответствовать UIImageView.

Моя проблема в том, что если, например, изображение внутри UIImageView масштабируется до 220x100, я бы хотел, чтобы UIImageView сокращался с высоты от 155 до 100, чтобы избежать пробелов между моими элементами.

Как я могу это сделать?

Ответы

Ответ 1

Если бы я понял, что это будет так: получить размер изображения:

UIImage * img = [UIImage imageNamed:@"someImage.png"];
CGSize imgSize = img.size;

рассчитать масштабное соотношение по ширине

float ratio=yourImageView.frame.size.width/imgSize.width;

проверить масштабированную высоту (с использованием того же соотношения, чтобы сохранить аспект)

float scaledHeight=imgSize.height*ratio;
if(scaledHeight < yourImageView.frame.size.height)
{
   //update height of your imageView frame with scaledHeight
}

Ответ 2

На основании ответа Майкла, здесь полный метод

+ (CGSize)makeSize:(CGSize)originalSize fitInSize:(CGSize)boxSize
{
    float widthScale = 0;
    float heightScale = 0;

    widthScale = boxSize.width/originalSize.width;
    heightScale = boxSize.height/originalSize.height;

    float scale = MIN(widthScale, heightScale);

    CGSize newSize = CGSizeMake(originalSize.width * scale, originalSize.height * scale);

    return newSize;
}

Ответ 3

Изменить для Steven Stefanik answer: Этот метод ломается, когда originalSize - {0, 0}. Возможно, рассмотрите эти изменения

-(CGSize)makeSize:(CGSize)originalSize fitInSize:(CGSize)boxSize
{
    if (originalSize.height == 0) {
        originalSize.height = boxSize.height;
    }
    if (originalSize.width == 0) {
        originalSize.width = boxSize.width;
    }

    float widthScale = 0;
    float heightScale = 0;

    widthScale = boxSize.width/originalSize.width;
    heightScale = boxSize.height/originalSize.height;

    float scale = MIN(widthScale, heightScale);

    CGSize newSize = CGSizeMake(originalSize.width * scale, originalSize.height * scale);

    return newSize;
}

Ответ 4

Последнее редактирование:

Кажется, я неправильно понял вопрос.

Чтобы получить фактический размер, вы можете попробовать:

CGSize imageSize = img.size;
CGSize viewSize = imageView.frame.size;
CGSize actualSize;

if (imageSize.width > imageSize.height) {
    actualSize.width = imageSize.width > viewSize.width ? viewSize.width : imageSize.width;

    actualSize.height = imageSize.height * actualSize.width / imageSize.width;
}
else {
    actualSize.height = imageSize.height > viewSize.height ? viewSize.height : imageSize.height;

    actualSize.width = imageSize.width * actualSize.height / imageSize.height;
}