19

我很惊讶没有找到这个问题的答案,也许是我忽略了一些非常简单的事情:

应用 CGAffineTransform 后如何获得 UIView 的实际大小?

例如。

我的 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 包含应用了转换的视图的尺寸再次感谢drawonward

4

6 回答 6

44

我在Objective C中使用它:

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

或在 Swift 4 中:

let transformedBounds = view.bounds.applying(view.transform)
于 2011-07-06T13:26:19.177 回答
12

[myView frame]返回父视图的框架,用于布局和相对大小。 [myView bounds]返回视图本身的边界,用于绘图。如果您已将变换应用于多个视图,则可以使用convertRect:to 或 from 一个视图。

编辑:

也许是这样的。

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

用于[view center]在 superview 中查找位置。

于 2010-04-23T04:26:59.120 回答
4

老问题,但在搜索解决方案和大量尝试后遇到了这里。这很简单;

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;

最后。

于 2014-04-16T20:11:07.747 回答
3

使用CGSizeApplyAffineTransform(size, transform)它会返回一个转换后的大小。也有类似的CGPointCGRect功能。

于 2010-04-23T04:19:11.650 回答
2

更简单:具有(边界)大小 s 的视图应用了变换 tr 具有结果大小:

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

但是,如果视图的父视图或任何祖先视图应用了任何非单位变换,那么这个大小在绝对意义上没有什么意义。

如果在对视图或其父视图应用任意变换后,您希望在窗口坐标中获得视图的绝对大小,则应首先通过将所有视图变换组合到根窗口来计算绝对变换矩阵,然后应用上面公式的结果。

于 2010-09-23T17:27:08.057 回答
0

但是你应用一个旋转变换,CGPathGetBoundingBox 没有得到正确的大小。

于 2013-11-01T07:07:50.473 回答