应用比例并将转换转换为UIBezierPath

时间:2013-04-22 22:56:23

标签: objective-c uibezierpath affinetransform

我有一个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被绘制到列表中的下一个点。

enter image description here

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

enter image description here

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

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

2 个答案:

答案 0 :(得分:2)

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

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

此外,坐标系很重要,特别是在缩放时。确保绘制0,0左右,然后缩放然后平移。如果您对点进行标准化,这是最简单的。标准化lat / long值意味着将纬度除以90和经度除以180(这实际上会给你一个范围-1..1)。执行此操作时,您应首先缩放路径,然后将其转换为视图的中心,然后应用所需的翻译。

答案 1 :(得分:2)

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

我可能在这个问题上错了,但不是这个代码

CGAffineTransformMakeTranslation(0, 0);

只是说应该沿着x轴移动0像素,沿y轴移动0像素? (reference)它实际上不会将任何东西移动到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: