Получить размер UIView после применения CGAffineTransform - PullRequest
18 голосов
/ 23 апреля 2010

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

Как получить реальный размер UIView после применения к нему CGAffineTransform?

например.

мой UIView имеет размер 300 x 200, я применяю масштабное преобразование, скажем, фактор 2, как горизонтальный, так и вертикальный, поэтому UIView теперь занимает 600 x 400 на экране, но его границы и границы его слоя по-прежнему возвращают размер 300 x 200 ... где найти реальный размер UIView?

пс. забыл упомянуть, я хочу также повернуть uiview. Если я применяю только масштабирование, CGSizeApplyAffineTransform прекрасно работает, но когда есть вращение, то оно не работает должным образом.

Редактировать: drawonward указал мне правильное направление, я просто немного усовершенствовал код для компиляции, и вот он:

UIView* view = (your view being transformed);
CGAffineTransform trans = (view.transform or create a new transformation);

CGRect rect = [view bounds];
CGMutablePathRef path = CGPathCreateMutable();
rect.origin = CGPointZero;
CGPathAddRect(path , &trans , rect);
rect = CGPathGetBoundingBox( path );
CGPathRelease( path );

Теперь rect.size содержит размеры представления с примененным преобразованием. Еще раз спасибо обращается к

Ответы [ 6 ]

38 голосов
/ 06 июля 2011

Я использую это в Цели C:

CGRect transformedBounds = CGRectApplyAffineTransform(view.bounds, view.transform);

или в Swift 4:

let transformedBounds = view.bounds.applying(view.transform)
12 голосов
/ 23 апреля 2010

[myView frame] возвращает рамку представления, видимого родителем, для макета и относительных размеров. [myView bounds] возвращает границы вида, который виден сам по себе, для рисования. Если у вас есть преобразования, примененные к нескольким представлениям, вы можете использовать convertRect: для или из представления.

Edit:

Может быть, что-то вроде этого.

CGRect rect = [view bounds];
CGPathRef path = CGPathCreateMutable();
rect.origin = CGPointZero;
CGPathAddRect( rect , [view transform] );
rect = CGPathGetBoundingBox( path );
CGPathRelease( path );

Использование [view center] для поиска позиции в суперпредставлении.

2 голосов
/ 17 апреля 2014

Старый вопрос, но столкнулся здесь, после поиска решения и множества попыток.Это было просто;

view.layer.frame применил все преобразования, и вы легко получите размер от view.layer.frame.size.

- ниже здесь нет ответа на этот вопрос- -

И для моей проблемы я пытался вычислить новое значение center после изменения layer.anchorPoint моего повернутого вида, чтобы он не двигался.И, наконец, сделал это так:

CGPoint topLeft = [self.superview convertPoint:CGPointMake(0, 0) fromView:self];
self.layer.anchorPoint = CGPointMake(0, 0);
self.center = topLeft;

для реверса

CGPoint center = [self.superview convertPoint:CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2) fromView:self];
self.layer.anchorPoint = CGPointMake(.5, .5);
self.center = center;

наконец.

2 голосов
/ 23 сентября 2010

Проще: представление с размером (в границах) s, к которому применяется преобразование tr, имеет результирующий размер:

CGSizeMake(s.width*hypotf(tr.a, tr.b), s.height*hypotf(tr.c, tr.d))

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

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

2 голосов
/ 23 апреля 2010

Используйте CGSizeApplyAffineTransform(size, transform), и он вернет преобразованный размер. Также есть похожие функции CGPoint и CGRect.

0 голосов
/ 01 ноября 2013

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

...