应用CGAffineTransform后获取UIView的大小

时间:2010-04-22 21:50:19

标签: objective-c uiview cgaffinetransform

我很惊讶没有找到这个问题的答案,也许是某种非常简单的东西我忽略了:

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

例如。

我的UIView大小为300 x 200,我应用缩放变换让我们说因素2水平和垂直,所以UIView现在在屏幕上需要600 x 400,但它的界限和它的图层边界仍然返回大小300 x 200 ......我在哪里可以找到UIView的实际尺寸?

PS。忘了提我也想旋转uiview。如果我只应用缩放CGSizeApplyAffineTransform工作得很好,但是当它还有旋转时,它就无法正常工作。

编辑:drawnonward指出我正确的方向,我只是改进了一些代码来编译,这里是:

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

6 个答案:

答案 0 :(得分:38)

我在Objective C中使用它:

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

或在Swift 4中:

let transformedBounds = view.bounds.applying(view.transform)

答案 1 :(得分:12)

对于布局和相对大小,

[myView frame]返回父级看到的视图框架。 [myView bounds]返回视图的边界,如图所示,用于绘制。如果您将变换应用于多个视图,则可以在视图中使用convertRect:

编辑:

也许是这样的。

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

使用[view center]在超级视图中查找位置。

答案 2 :(得分:2)

使用CGSizeApplyAffineTransform(size, transform),它将返回转换后的大小。还有类似的CGPointCGRect函数。

答案 3 :(得分:2)

更简单:应用了变换tr的(边界)尺寸s的视图具有最终尺寸:

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

但是,如果视图的超级视图或任何祖先视图应用了任何非单位变换,则此大小在绝对意义上没有多大意义。

如果要在任意变换应用于该视图或其超视图后想要窗口坐标中视图的绝对大小,则应首先通过将所有视图变换组合到根窗口来计算绝对变换矩阵,并且然后将上述公式应用于结果。

答案 4 :(得分:2)

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

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;

最后。

答案 5 :(得分:0)

但是你应用了旋转变换,CGPathGetBoundingBox的大小不合适。