如何相对于另一个定位此视图?

时间:2009-08-18 16:40:23

标签: iphone cocoa-touch uikit

考虑一下速度表,并想象一下它周围的所有这些小动作,如10英里/小时,20英里/小时,30英里/小时等等。我尝试绘制类似的东西。

想象一下:有三种观点:A,B,C。

A拥有B拥有C. C是该速度表的中风。因此,为了容易地创建它,在它们之间存在视图B,其大小与A完全相同。首先,C位于顶部的中心,y = 0。这很简单。然后,B旋转10度。也很简单。我继续在A的顶部添加B + C的“副本”,直到我在那个车速表上有所有笔画。

但是现在:这对记忆来说是一个很大的浪费,因为B只是垃圾。它只包含C并且只使用一次将C轻松带入所需位置。我想摆脱B,而是将C直接放在A的顶部。

我怎么能这样做?我可以将坐标从C转换为A的坐标,然后摆脱B并将C直接放在A上吗?请注意,B旋转并且与A一样大。这很难解释。如果您需要进一步说明,请与我们联系。

2 个答案:

答案 0 :(得分:1)

这个问题很模糊,但这里有三个可能有所帮助的想法:

(1)你可以摆脱B而不是摆脱A吗?

(2)UIView方法convertPoint:toView: - 您可以在B上调用此方法,以C的形式查找A的坐标},并使用它将B的子视图移动到A

(3)您可以使用一些好的''trig'来添加小的子视图,甚至可以直接在您想要的位置绘制,而不是旋转视图。

例如,这里可能有助于在车速表周围画出刻度线:

CGPoint from, to;
CGFloat innerRadius = 50.0;
CGFloat outerRadius = 60.0;
for (float angle = 0; angle < M_PI*2; angle += M_PI/100) {
  from.x = innerRadius * cos(angle);
  from.y = innerRadius * sin(angle);
  to.x = outerRadius * cos(angle);
  to.y = outerRadius * sin(angle);
  [self drawLineFrom:from to:to];
}

为了有用,您可能希望将这些点(旋转中心(0,0))转换为以视图中的点为中心。

答案 1 :(得分:0)

我认为你可以通过添加C来轻松摆脱B,然后将C的锚点设置为圆的中心(我假设y = A.frame.size.height,x居中),并且然后你可以将旋转应用到C,它应该围绕该锚旋转,以获得所需的效果。

这样的东西
C.layer.anchorPoint = CGPointMake(A.frame.size.height, A.center.x);
C.transform = CGAffineTransformMakeRotation(angle);

或者您也可以将C添加到A的中心,然后创建平移和旋转的连接变换。

CGAffineTransform trans1 = CGAffineTransformMakeRotation(angle);
CGAffineTransform trans2 = CGAffineTransformMakeTranslation(0, A.frame.size.height);
C.transform = CGAffineTransformConcat(trans1, trans2);

虽然如果你真的想要绘制所有这些刻度线,Tyler的绘图解决方案可能更好。