4

我有一个 UIBezierPath,我想:

  • 移动到 UIView 上的任意坐标
  • 变大或变小

我正在根据预定义坐标列表绘制 UIBezierPath。我实现了这段代码:

CGAffineTransform move = CGAffineTransformMakeTranslation(0, 0);

CGAffineTransform moveAndScale = CGAffineTransformScale(move, 1.0f, 1.0f);
[shape applyTransform:moveAndScale];

我也尝试过缩放然后移动形状,这似乎没什么区别。

使用此代码:

[shape moveToPoint:CGPointMake(0, 0)];  

我开始在 (0, 0) 处绘制形状,但这就是发生的情况。我认为这是因为正在从 0、0 到列表中的下一个点绘制一条线。

在此处输入图像描述

当我将移动变换设置为 (0, 0) 时,这就是它绘制的位置。在这里,moveToPoint 设置为列表中的第一个坐标对。如您所见,它不在 0, 0 处。

在此处输入图像描述

最后,增加 1.0f 将形状完全移出屏幕,无论我告诉形状移动到哪里。

有人可以帮我理解为什么形状没有在 0、0 处绘制,以及为什么当我缩放它时它会移出屏幕。

4

2 回答 2

2

(根据 OP 在上述评论中的要求)

我可能在这方面错了,但这段代码不是

CGAffineTransformMakeTranslation(0, 0);

只是说应该沿 x 轴移动 0 个像素,沿 y 轴移动 0 个像素?(参考)它实际上不会将任何东西移动到 origo (0, 0),就像您正在尝试做的那样。

此外,您似乎有点误解了如何正确使用moveToPoint:.. 将其视为移动光标的一种方式,但实际上并没有绘制任何东西。这只是一种表达“我想在此时开始绘画”的方式。绘图本身可以通过其他方法进行。如果你想画一个边长为L的正方形,那么你可以做这样的事情..

// 'shape' is a UIBezierPath
NSInteger L = 100;
CGPoint origin = CGPointMake(50, 50);
[shape moveToPoint:origin]; // Initial point to draw from
[shape addLineToPoint:CGPointMake(origin.x+L, origin.y)]; // Draw from origin to the right
[shape addLineToPoint:CGPointMake(origin.x+L, origin.y+L)]; // Draw a vertical line
[shape addLineToPoint:CGPointMake(origin.x, origin.y+L)]; // Draw bottom line
[shape addLineToPoint:origin]; // Draw vertical line back to origin

请注意,此代码根本没有经过测试,但它应该让您了解如何使用moveToPoint:addLineToPoint:.

于 2013-04-23T00:30:09.743 回答
2

您需要注意应用变换的顺序,并且应该考虑将变换连接在一起并一次性应用它们。

顺序很重要,因为每个变换都会影响路径中的所有 x,y 位置。因此,翻译受比例影响。颠倒顺序,路径将被缩放然后移动。

此外,坐标系也很重要,尤其是在缩放时。确保在 0,0 附近绘制,然后缩放,然后平移。如果您将点标准化,这是最简单的。归一化纬度/经度值意味着将纬度除以 90,将经度除以 180(这实际上会给您一个范围 -1..1)。执行此操作时,您应该首先缩放路径,然后将其平移到视图的中心,然后应用您想要的平移。

于 2013-04-22T23:08:05.190 回答