Получите новый размер изображения из imageview после применения CGAffineTransform

Я использую UIGestureRecognizers для поворота и изменения размера изображения с помощью uiimageview. Теперь проблема в том, что мне нужно получить новый размер изображения из свойства преобразования UIImageView (которое является CGAffineTransform). Я нашел этот код в StackOverFlow, но он не возвращает правильные значения. Поскольку изображение не только изменяется, но и поворачивается. Итак, мой вопрос в том, как получить новый размер и местоположение из повернутого и измененного свойства преобразования UIImageView?

CGRect newRect = CGRectApplyAffineTransform(self.imageView.bounds, self.imageView.transform);

Кто-нибудь может помочь?

Спасибо

ОТВЕТ Хорошо, я нашел исправление. Главное, что создавало проблемы при расчете размеров, было вращение. Так что же тут проверить.

 CGFloat angle = atan2(self.imageView.transform.b, self.imageView.transform.a);
 CGAffineTransform tempTransform = CGAffineTransformRotate(self.imageView.transform, -angle);  
 CGRect newRect = CGRectApplyAffineTransform(CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height), tempTransform);

Спасибо всем


person andy    schedule 24.04.2012    source источник


Ответы (2)


Вы можете использовать временные точки для имитации преобразований размеров размера, примерно так:

CG_INLINE CGSize FAE_CGSizeCalcDimentionsAfterApplyTransformation(CGSize size, CGAffineTransform transform)
{
    CGPoint widthPoint = CGPointMake(size.width, 0.0);
    CGPoint heightPoint = CGPointMake(0.0, size.height);

    CGPoint centerAfterTransfrom = CGPointApplyAffineTransform(CGPointZero, transform);
    CGPoint widthAfterTransform = CGPointApplyAffineTransform(widthPoint, transform);
    CGPoint heightAfterTransform = CGPointApplyAffineTransform(heightPoint, transform);

    CGSize sizeAfterTransformation = CGSizeMake(TB_CGPointCalcDistance(centerAfterTransfrom, widthAfterTransform), TB_CGPointCalcDistance(centerAfterTransfrom, heightAfterTransform));

    return sizeAfterTransformation;
}
person Andrew Romanov    schedule 09.08.2014
comment
что такое TB_CGPointCalcDistance? - person Shay Erlichmen; 09.08.2015
comment
TB_CGPointCalcDistance - это настраиваемая функция для вычисления расстояния между точками: sqrt (dx dx + dy dy) - person Andrew Romanov; 10.08.2015

Из Apple документ:

Поскольку аффинные преобразования не сохраняют прямоугольники в целом, функция CGRectApplyAffineTransform возвращает наименьший прямоугольник, содержащий преобразованные угловые точки параметра rect.

Может, тебе стоит попробовать следующее: CGSizeApplyAffineTransform:

Возвращает высоту и ширину, полученные в результате преобразования существующей высоты и ширины.

Попробуйте использовать старый размер imageView:

CGSize oldImageSize = imageView.bounds.size;

// Transforming code here

CGAffineTransform currentTransform = imageView.transform;
CGSize newImageSize = CGSizeApplyAffineTransform(oldImageSize, currentTransform);
person Jonathan Naguin    schedule 24.04.2012
comment
Спасибо! Но я уже пробовал, эта функция возвращает ширину правильно, но значение высоты неточно. любая идея? - person andy; 24.04.2012
comment
привет, ты получил ответ, пожалуйста, помоги мне @ Джонатан Нагин - person Babul; 10.12.2012