【问题标题】:Drawing a straight line between two points by dragging on IOS通过在IOS上拖动在两点之间画一条直线
【发布时间】:2013-03-08 14:18:29
【问题描述】:

我的 UIVIew 中有两个方形图像。一旦我将手指从一个图像拖动到另一个图像,我想在它们之间画一条直线。

我已经处理了touchesMoved 方法来检查我的 touchLocation 何时到达任一图像的框架。所以我已经处理了 when 开始绘制的逻辑部分以及 在哪两点之间。

我只是不知道如何使用(void)drawRect:(CGRect)rect 做到这一点。一方面,我在 drawRect 中添加了一个 NSlog,并编写了代码在两行之间画一条线,即使这没有发生。

我检查了这个question too,但我想继续在多个点之间拖动和画线。

    - (void)drawRect:(CGRect)rect
{
    NSLog(@"Draw Rect Entered");
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetStrokeColorWithColor(context, [[UIColor blackColor]CGColor]);
    CGContextSetLineWidth(context, 1.0);
    CGContextMoveToPoint(context, 0, 0);
    CGContextAddLineToPoint(context, 20, 20);
    CGContextStrokePath(context);
}

【问题讨论】:

  • -drawRect: 肯定会被调用 - 你在某处调用 -setNeedsDisplay 吗?
  • drawRect 没有被调用..no我没有调用-setneedsDisplay。我必须在哪里调用它?

标签: iphone ios drawrect


【解决方案1】:

为了更新视图,您需要在需要重绘的视图上调用-setNeedsDisplay-setNeedsDisplayInRect:。一旦确定需要画线,就应该在触摸处理程序中执行此操作。这将触发视图上的-drawRect: 方法——您不会直接调用-drawRect。如需更多信息,请阅读UIView docs。我不知道您是否希望您的线在创建后永久存在-如果有可能将其删除,我将在-drawRect: 中添加一个if 语句,该语句由一个布尔值控制,以确定是否绘制该线.然后,您可以在必要时轻松将其关闭。

根据您下面的 cmets,我将创建一个 ivar 数组,在其中存储当前跟踪线的点,然后在 -drawRect: 中循环它们,使用核心图形函数在 a 处绘制线段时间。这样,每次重绘都会绘制新段和所有以前的段。由于CGPoint 不是 obj-c 对象,您要么必须创建一个包装类,要么使用 obj-C++ 和 std::vector。您还可以使用固定大小的 C-Array,(您提到您正好有 10 个点)- 在这种情况下,您必须将未使用的坐标预设为定义为无效的任意值(例如 -500、-500)并添加如果遇到这些值,则不绘制线段的逻辑。

次要点-我不会硬编码线坐标-相反,您可以从图像的frame 属性中获取它们。这样一来,您的代码将更具可读性,并且在您更改图像或调整它们的大小时不会中断。

【讨论】:

  • 场景是:我在视图上的任意 10 个给定点之间拖动。一旦两个点连接起来,就会在它们之间画一条线。一旦拖动继续到另一点,则该线在该线之间继续。有点像安卓手机的锁屏。
  • 这些点是 UIImages。我在 viewDidLoad 中添加了[self.view setNeedsDisplay]。仍然没有调用drawRect。
  • -viewDidLoad 在视图加载时被调用一次。每次更新线段时都需要重新绘制视图。所以调用应该在touchesMoved:touchesEnded: 或任何你检测到需要绘制新段的地方
  • IB 中的所有内容都连接了吗?我会在调试器中停下来检查self.view 不是nil。如果不是 nil,请检查它是否指向正确的视图
  • self.view 不为零。 IB 中的一切都是相互关联的。我正在使用 OutletCollection,但这应该不是问题吧?
【解决方案2】:

我遇到了两个可能导致此问题的问题:
1) 确保您在主线程上调用 setNeedsDisplay
2) 如果您使用多个视图,请确保您针对正确的视图调用 setNeedsDisplay
使用一个视图很容易而忘记对父视图调用setNeedsDisplay

【讨论】:

    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2022-01-10
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多