iOS - 负坐标上的2D线条绘制

时间:2016-02-21 03:57:45

标签: ios objective-c core-graphics

我正在开发一个用户可以绘制线条的应用。同一个应用程序的桌面版本能够在负坐标上绘制线条,我也希望在iOS应用程序中具有相同的功能。

到目前为止我尝试了什么: - 我有一个UIViewController,我已经覆盖了- (void)drawRect:(CGRect)rect并绘制了这条线。这是我正在使用的代码: -

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, self.bounds);

CGPoint startPoint = CGPointMake(self.startHandle.frame.origin.x + self.startHandle.frame.size.width/2, self.startHandle.frame.origin.y + self.startHandle.frame.size.height/2);

CGPoint endPoint = CGPointMake(self.endHandle.frame.origin.x + self.endHandle.frame.size.width/2, self.endHandle.frame.origin.y + self.endHandle.frame.size.height/2);

CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
CGContextSetLineWidth(context, 2.0f);
CGContextMoveToPoint(context, startPoint.x, startPoint.y ); //start at this point
CGContextAddLineToPoint(context, endPoint.x, endPoint.y); //draw to this point

在我将startPoint.x作为负值之前,它非常有效。对于负值,我不会看到0,0坐标后面的线部分。任何帮助或信息都表示赞赏。

2 个答案:

答案 0 :(得分:2)

继续@matt说的话(他已经删除了他的答案,因为它仍然有用而感到羞耻),你只想将变换应用于上下文,以便在标准的笛卡尔坐标系中绘制,其中{{ 1}}是屏幕的中心。

(0,0)内部提供给您的上下文的来源位于屏幕的左上角,正y方向位于屏幕下方。

enter image description here

首先,我们首先想要翻转y轴,使正y方向上升到屏幕上。

我们可以使用drawRect来完成此操作。这将反映上下文的y轴。因此,这个反射的上下文将具有y轴,其中正方向在屏幕上方。

enter image description here

接下来,我们要将上下文转换为正确的位置,以便CGContextScaleCTM(context, 1, -1)对应于屏幕的中心。因此,我们应该将y轴向下移动高度的一半(使y轴上的(0,0)现在位于中心),并将x轴向右移动一半宽度。

我们可以使用0来完成此操作,其中CGContextTranslateCTM(context, width*0.5, -height*0.5)width分别是视图的宽度和高度。

现在您的上下文坐标将如下所示:

enter image description here

您可以在height中实现此功能:

drawRect

这将提供以下输出:

enter image description here

我添加了红线代表y和x轴,以澄清我们在这里所做的事情。

答案 1 :(得分:0)

CGContextClearRect(context, self.bounds);

你可以画出这个界限,请做一个更大的矩形。