2

我正在尝试使用 CGAffineTransformRotate 旋转基于触摸手势在父视图上添加的自定义视图 (VIEWA)。一切正常。现在,我在父视图上添加了另一个视图(VIEWB),它应该在旋转时遵循由 VIEWA 的角跟踪的路径。

我所做的是从 VIEWA 转换矩阵计算 VIEWB 的新坐标并翻译子视图。IE

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 回答