应用CGAffineTransform后获取UIView的大小

问题描述 投票:0回答:7

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

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

例如。

我的 UIView 的大小为 300 x 200,我应用了缩放变换,比如说水平和垂直的因子 2,因此 UIView 现在在屏幕上的大小为 600 x 400,但它的边界和图层的边界仍然返回 300 x 的大小200 ...我在哪里可以找到 UIView 的实际大小?

ps。忘了提及我还想旋转 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

objective-c uiview cgaffinetransform
7个回答
47
投票

我在 Objective C 中使用它:

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

或者在 Swift 4 中:

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

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]
来查找在超级视图中的位置。


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;

终于。


3
投票

使用

CGSizeApplyAffineTransform(size, transform)
,它将返回变换后的尺寸。还有类似的
CGPoint
CGRect
功能。


2
投票

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

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

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

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


0
投票

如果您应用了视图的 CGAffineTransform

.layer
,则缩放和/或平移变换后调整后的 CGRect 区域只是
view.layer.frame


0
投票

但是你应用旋转变换,它没有得到正确的尺寸

CGPathGetBoundingBox

© www.soinside.com 2019 - 2024. All rights reserved.