I was surprised not to find an answer to this question, maybe is something very simple I somehow overlook :
How to get the real size of an UIView after I apply a CGAffineTransform to it?
eg.
my UIView has size 300 x 200, I apply a scaling transform let's say factor 2 both horizontal and vertical, so the UIView now takes 600 x 400 on the screen, but it's bounds and it's layer's bounds are still returning a size of 300 x 200 ... where do I find the real size of the UIView ?
ps. forgot to mention I want to also rotate the uiview. If I apply only scaling CGSizeApplyAffineTransform works great, but when there's also rotation, then it does not work properly.
Edit: drawnonward pointed me in the right direction, I just refined a bit the code to compile and here it is :
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 );
Now rect.size contains the dimensions of the view with the transformation applied Thanks again to drawnonward
But you apply a rotating transform, it don't get right size by CGPathGetBoundingBox.
Use
CGSizeApplyAffineTransform(size, transform)
and it will return a transformed size. There are similarCGPoint
andCGRect
functions as well.[myView frame]
returns the frame of the view as seen by the parent, for layout and relative sizes.[myView bounds]
returns the bounds of the view as seen by itself, for drawing. If you have transforms applied to multiple views, you can useconvertRect:
to or from a view.Edit:
Maybe something like this.
The use
[view center]
to find the position in the superview.I use this in Objective C:
or in Swift 4:
Simpler: A view with (bounds) size s to which transform tr is applied has resulting size:
However, if view's superview or any ancestor view has any non-unit transform applied, this size makes little sense in absolute terms.
If you want the absolute size of a view in window coordinates after any arbitrary transform has been applied to that view or its superviews, you should first compute the absolute transform matrix by composing all the view transform up to the root window, and then apply the above formula to the result.
Old question, but bumped into here, after searching a solution and tons of attempts. It was simple;
view.layer.frame
has all transformations applied and you'll get the size fromview.layer.frame.size
easily.-- below here is not an answer to this question - -
And for my problem, I was trying to calculate new
center
value after changinglayer.anchorPoint
of my rotated view, so it doesn't move. And finally did it like this;for reverse
finally.