Подтвердить что ты не робот

Получите ширину измененного изображения после UIViewContentModeScaleAspectFit

У меня есть UIImageView, и я помещаю в него изображение, которое я изменяю следующим образом:

UIImageView *attachmentImageNew = [[UIImageView alloc] initWithFrame:CGRectMake(5.5, 6.5, 245, 134)];
attachmentImageNew.image = actualImage;
attachmentImageNew.backgroundColor = [UIColor redColor];
attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit;

Я попытался получить ширину измененного изображения в моем UIImageView, выполнив следующее:

NSLog(@"Size of pic is %f", attachmentImageNew.image.size.width);

Но он фактически возвращает мне ширину исходного изображения. Любые идеи о том, как получить рамку изображения, которую я вижу на экране?

EDIT: Здесь, как выглядит мой UIImageView, красная область - это backgroundColor

enter image description here

4b9b3361

Ответ 1

Я не знаю, есть ли более четкое решение, но это работает:

float widthRatio = imageView.bounds.size.width / imageView.image.size.width;
float heightRatio = imageView.bounds.size.height / imageView.image.size.height;
float scale = MIN(widthRatio, heightRatio);
float imageWidth = scale * imageView.image.size.width;
float imageHeight = scale * imageView.image.size.height;

Ответ 2

Решение в Swift:

let currentHeight = imageView.bounds.size.height
let currentWidth = imageView.bounds.size.width
let newWidth = UIScreen.mainScreen().bounds.width
let newHeight = (newWidth * currentHeight) / currentWidth

println(newHeight)

Ответ 3

Он имеет ссылку на исходное изображение, поэтому всегда дает те же размеры, что и для исходного изображения.

Чтобы получить размеры нового изображения, вы должны проверить соотношение сторон. Я получил формулу для моей потребности, используя разные изображения разного размера, используя Preview, чтобы изменить размер изображения в соответствии с его соотношением сторон.

Ответ 4

В соответствии с Apple Documentation для UIViewContentModeScaleAspectFit

Он масштабирует контент (в вашем случае actualImage), чтобы соответствовать размеру представления (в вашем случае attachmentImageNew), поддерживая соотношение сторон.

Это означает, что ваш размер изображения (после масштабирования) должен быть таким же, как ваш UIImageView.

ОБНОВЛЕНИЕ:

Одно новое предложение для вас, если вы не хотите использовать UIViewContentModeScaleAspectFit, и если вы можете исправить размер scaledImage, вы можете использовать нижеприведенный код для масштабирования изображения для исправления newSize, а затем вы можете использовать ширину к вашему коду.

CGSize newSize = CGSizeMake(100.0,50.0);
UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Ответ 5

в вашем случае:

float yourScaledImageWitdh =  attachmentImageNew.frame.size.height *  attachmentImageNew.image.size.width / attachmentImageNew.image.size.height
NSLog(@"width of resized pic is %f", yourScaledImageWitdh);

но вы должны также проверить, до исходной пропорции изображения и пропорции imageView, моя строка кода хороша на всякий случай, если красная область добавляется горизонтально, а не в том случае, если ваша исходная пропорция изображения больше, чем пропорция кадра ImageView

Ответ 6

Для Swift 2 вы можете использовать этот фрагмент кода для выравнивания изображения aspectFitted к внизу экрана strong > (взято из более ранних ответов на этот вопрос → благодаря вам, ребята)

let screenSize: CGRect = UIScreen.mainScreen().bounds
let screenWidth = CGFloat(screenSize.width)
let screenHeight = CGFloat(screenSize.height)

imageView.frame = CGRectMake(0, screenHeight - (imageView.image?.size.height)! , screenWidth, (imageView.image?.size.height)!)

let newSize:CGSize = getScaledSizeOfImage(imageView.image!, toSize: self.view.frame.size)

imageView.frame = CGRectMake(0, screenHeight - (newSize.height) , screenWidth, newSize.height)

func getScaledSizeOfImage(image: UIImage, toSize: CGSize) -> CGSize       
{
    let widthRatio = toSize.width/image.size.width
    let heightRatio = toSize.height/image.size.height
    let scale = min(widthRatio, heightRatio)
    let imageWidth = scale*image.size.width
    let imageHeight = scale*image.size.height
    return CGSizeMake(imageWidth, imageHeight)
}