2

CGAffineTransformRotate を使用して、タッチ ジェスチャに基づいて、親ビューに追加されたカスタム ビュー (VIEWA) を回転させようとしています。すべてが正常に機能しています。これで、親ビューに別のビュー (VIEWB) が追加されました。このビューは、回転中に VIEWA のコーナーによってトレースされたパスをたどる必要があります。

私がしたことは、VIEWA変換マトリックスからVIEWBの新しい座標を計算し、サブビューを翻訳することでした。すなわち

VIEWA.transform = CGAffineTransformRotate(startTransform, -angleDifference+M_PI_2);
CGFloat cosa = VIEWA.transform.a;
CGFloat msinb = VIEWA.transform.b;
CGFloat sinc = VIEWA.transform.c;
CGFloat cosd = VIEWA.transform.d;

CGFloat newX = VIEWB.center.x * cosa + VIEWB.center.y * msinb;
CGFloat newY = VIEWB.center.x * sinc + VIEWB.center.y * cosd;

CGFloat xdiff = newX - VIEWB.center.x;
CGFloat ydiff = newY - VIEWB.center.y;

VIEWB.transform = CGAffineTransformTranslate(VIEWB.transform, xdiff, ydiff);

しかし、私は欲しいものを手に入れることができませんでした。誰かが私を助けることができますか?

アップデート:

これは私がやろうとしていることです:(赤い点はAで、黒いポップアップはBです):

ここに画像の説明を入力

4

1 に答える 1

4

ビュー A を回転すると仮定しますが、赤い円はビュー A の座標系の固定位置にとどまります。したがって、ビュー A の座標系での赤い円の中心は、次のように簡単に計算できるはずです。

CGPoint redCircleCenterInViewA = CGPointMake(CGRectGetMidX(viewA.bounds), 12);

次のように、そのポイントを親ビューの座標系に単純に変換できます。

CGPoint redCircleCenterInParentView = [viewA convertPoint:redCircleCenterInViewA
    toView:viewA.superview];

次に、ビュー B の中心をそのポイントからビュー B の高さの半分を引いた値に設定できます。

viewB.center = CGPointMake(redCircleCenterInParentView.x,
    redCircleCenterInParentView.y - viewB.frame.size.height / 2);

アップデート

ビューA ではなく、実際にはレイヤーAがあることがわかります。わずかな変更が必要なだけです。座標を変換するためにレイヤーに送信するメッセージは、ビューに送信するメッセージとは少し異なります。

CALayer *layerA = ...;
UIView *parentView = ...;
UIView *viewB = ...;

CGPoint redCircleCenterInLayerA = CGPointMake(CGRectGetMidX(layerA.bounds), 12);

CGPoint redCircleCenterInParentView = [layerA convertPoint:redCircleCenterInLayerA
    toLayer:parentView.layer];

viewB.center = CGPointMake(redCircleCenterInParentView.x,
    redCircleCenterInParentView.y - viewB.frame.size.height / 2);

convertPoint:fromLayer:とメッセージもありconvertPoint:fromView:ます。Xcode に間違ったものをオートコンプリートさせないでください。頭を悩ませることになります。

于 2013-07-01T05:32:25.080 に答える