0

回転、スケーリング、および翻訳しようとしている CGPath があります。また、ユーザーが変換を適用できるようにするためのヘルパーとして機能する「サイズ変更可能な」UIView があるため、このビューのフレームが変更されるたびに、選択した CGPath に新しい変換が適用されます。また、トランスフォーム アンカー ポイントを左上隅に設定します。それはうまくスケーリングおよび回転します。ただし、回転を 0 以外に設定してから拡大縮小すると、アンカー ポイントが左上隅になくなります。回転中に変更されたように見えるので、0 回転から始めて 360 まで回転すると、予想どおりアンカー ポイントが左上隅に戻されたとします。

変換を作成するために使用しているコードは次のとおりです。

CGPoint anchorPointInPixels = CGPointMake(self.boundingBox.origin.x, self.boundingBox.origin.y);

CGAffineTransform t = CGAffineTransformIdentity;
t = CGAffineTransformTranslate(t, self.translation.x + anchorPointInPixels.x, self.translation.y + anchorPointInPixels.y);
t = CGAffineTransformRotate(t, self.rotation);
t = CGAffineTransformScale(t, self.scale.x, self.scale.y);
t = CGAffineTransformTranslate(t, -anchorPointInPixels.x, -anchorPointInPixels.y);
self.transform = t;

そのコードを少し説明しましょう: 1. パスのポイントは絶対座標にあります 2. バウンディング ボックスは 1 回だけ計算され、パス内のすべてのポイントを囲む四角形として設定されます。バウンディング ボックスも絶対座標にあります 3. Translation はバウンディング ボックスの原点からのオフセットを指定するため、パスが作成されると、translation は 0 になり、ユーザーが移動するまでそのままになります。

では、アンカーポイントに影響を与えずに回転させるにはどうすればよいでしょうか?

読んでくれてありがとう!

マリアーノ

4

1 に答える 1

0

そのため、行列を連結することでこの問題を解決できました。コードは次のようになります。

CGPoint anchorPointForScalingInPixels = CGPointMake(origin.x + size.width * self.anchorPointForScaling.x,
                                                    origin.y + size.height * self.anchorPointForScaling.y);

CGPoint anchorPointForRotationInPixels = CGPointMake(origin.x + size.width * self.anchorPointForRotation.x,
                                                     origin.y + size.height * self.anchorPointForRotation.y);

CGAffineTransform rotation = CGAffineTransformIdentity;
rotation = CGAffineTransformTranslate(rotation, anchorPointForRotationInPixels.x, anchorPointForRotationInPixels.y);
rotation = CGAffineTransformRotate(rotation, self.rotation);
rotation = CGAffineTransformTranslate(rotation, -anchorPointForRotationInPixels.x, -anchorPointForRotationInPixels.y);

CGAffineTransform scale = CGAffineTransformIdentity;
scale = CGAffineTransformTranslate(scale, anchorPointForScalingInPixels.x, anchorPointForScalingInPixels.y);
scale = CGAffineTransformScale(scale, self.scale.x, self.scale.y);
scale = CGAffineTransformTranslate(scale, -anchorPointForScalingInPixels.x, -anchorPointForScalingInPixels.y);

CGAffineTransform translate = CGAffineTransformMakeTranslation(self.translation.x, self.translation.y);

CGAffineTransform t = CGAffineTransformConcat(rotation, CGAffineTransformConcat(scale, translate));

そうすれば、回転用とスケーリング用の 2 つのアンカー ポイントを処理できます。

于 2013-02-06T23:15:17.393 に答える