1

我想在 iPhone 屏幕上存储手指移动的路径。到目前为止,我只是在阅读触摸并将 CGPoints 添加到 NSMutableArray。当我尝试打印该数组中的所有 cgpoint 时,它是如何丢失中间点的。有更好的方法吗?我们可以直接存储整个路径吗?

这是我正在使用的代码

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

fingerSwiped = NO;
UITouch *touch = [touches anyObject];
lastPoint = [touch locationInView:self.view];
[self.myPoints addObject:[NSValue valueWithCGPoint:lastPoint]];
  }


 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
   {
fingerSwiped = YES;

UITouch *touch = [touches anyObject];   
CGPoint currentPoint = [touch locationInView:self.view];



UIGraphicsBeginImageContext(self.view.frame.size);
[slateImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), lineWidth);
//CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(),0,0,0, 1.0);
CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), self.drawcolor.CGColor);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
slateImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
lastPoint = currentPoint;
[myPoints addObject:[NSValue valueWithCGPoint:lastPoint]];   
}

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

if(!fingerSwiped) 
{
    UIGraphicsBeginImageContext(self.view.frame.size);
    [slateImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), lineWidth);
    //CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(),0,0,0, 1.0);
    CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), self.drawcolor.CGColor);
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    CGContextFlush(UIGraphicsGetCurrentContext());
    slateImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [myPoints addObject:[NSValue valueWithCGPoint:lastPoint]];
}
}
4

1 回答 1

6

你正在记录 iOS 愿意给你的每一点。

iOS 仅每 16.67 毫秒(每秒 60 次)报告一次触摸移动事件。没有办法(据我所知)比这更快地获得更新的触摸位置。

您说绘制接触点时得到直线。发生这种情况是因为用户移动手指的速度如此之快,以至于触摸在 16.67 毫秒内移动了相当大的量。触摸在更新之间移动得如此之远,以至于当您连接点时,它看起来不像是一条平滑的曲线。不幸的是,(正如我所说)没有办法让更新速度超过每秒 60 次。

解决这个问题的唯一方法是使用样条插值来连接报告的点。样条插值是一个复杂的主题。你可以使用谷歌找到很多关于它的信息。

您可以在 iPad 上的 Adob​​e Ideas 应用程序中查看此示例。如果你快速画一个大螺旋并仔细观察,你会发现当你抬起手指时线条变得更平滑。我相信它在您绘制螺旋线时会进行一些增量平滑,当您抬起手指时,它会返回并计算整条线的更好插值。

于 2012-03-01T07:35:50.483 回答