我正在尝试使用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 ):
最佳答案
我假设您旋转视图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自动完成错误的代码,否则您将抓挠头!关于iphone - 将CGAffineTransformRotation关联到CGAffineTransformTranslation,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17379959/