考虑一下速度表,并想象一下它周围的所有这些小动作,如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一样大。这很难解释。如果您需要进一步说明,请与我们联系。
答案 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的绘图解决方案可能更好。