【问题标题】:Touch events in UIViewUIView 中的触摸事件
【发布时间】:2012-09-07 09:48:46
【问题描述】:

我正在 iOS 中制作绘画应用程序。在这里我将简要介绍一下逻辑,

1.初始化位图
2.每当检测到 touchBegan 或 touchMoved 事件时,我在位图上的该位置绘制一个填充的 CGRect,并将位图绘制到屏幕上。

除了一个小问题,它工作得很好。如果我在模拟器中快速移动鼠标,我不会连续中风。它只是一系列断开连接的 CGRects 。我做了一些研究,结果表明在 iOS 中,触摸事件仅每 16 毫秒触发一次,但我不认为我移动鼠标的速度那么快。那么是模拟器问题还是我的代码问题?

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{    

       CGPoint touchPoint=[touch locationInView:self];

       CGContextFillRect (currentBitmap, CGRectMake (touchPoint.x -8 , touchPoint.y - 8   , rectangularBrushSize, rectangularBrushSize ));

       [self setNeedsDisplay]; //draw currentBitmap to screen

}

touchesMoved 的代码是一样的。 draw rect 方法将 currentBitmap 绘制到屏幕上。我想再补充一下,当我以中等速度移动鼠标时它可以完美运行。

【问题讨论】:

    标签: objective-c ios core-graphics uitouch


    【解决方案1】:

    你应该尝试使用CGContextMoveToPointCGContextAddLineToPoint来制作一个绘图应用,否则你的线条会看起来不流畅。

    *我用这种方式写了一个应用程序,没有遇到你遇到的问题。

    【讨论】:

      【解决方案2】:

      这很正常。您的代码或模拟器可能没有问题。不必在当前鼠标/手指位置绘制矩形,您必须记住(在实例变量中)最后一个位置,并用一条线将其与当前位置连接起来。

      touchesBegan:

      lastPosition = [[touches anyObject] locationInView:self];
      

      touchesMoved:

      currentPosition = [[touches anyObject] locationInView:self];
      CGContextMoveToPoint(context, lastPosition);
      CGContextAddLineToPoint(context, currentPosition);
      // Draw the line with the desired color and width here.
      lastPosition = currentPosition;
      

      【讨论】:

      • 我认为你是对的,但你能否澄清一下为什么会这样?我的印象是,当我们触摸和拖动时,中间的每个点都会触发 touchEvents,因此我们总是会得到一个连续的笔划。
      • 用曲线连接点会产生更自然的结果,不是吗?在检测到点后绘制曲线/线会引入延迟吗?
      • 这在技术上是不可能的。在计算机世界中,您(几乎)总是对现实世界有一个离散的表示。在这种情况下,触摸屏仅每隔几毫秒记录一次交互。它无法为您猜测您在这些点之间触摸了哪些像素。
      • 是的,曲线可能是更好的选择,但实现起来也困难得多。我看不出在上述实施中会有任何延迟。如果你愿意,你也可以在touchesBegan: 中画一个点/矩形。
      猜你喜欢
      • 2011-05-07
      • 2010-12-02
      • 2015-08-10
      • 2021-02-09
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      相关资源
      最近更新 更多