19

この質問に対する答えが見つからないことに驚きました。おそらく、私が見落としている非常に単純なものである可能性があります。

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 には、変換が適用されたビューの寸法が含まれています。

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]スーパービュー内の位置を見つけるために使用します。

于 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

より単純: 変換 tr が適用される (境界) サイズ s を持つビューの結果のサイズは次のとおりです。

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 に答える