我想在iPhone屏幕上存储手指移动的路径。截至目前,我只是阅读触摸并向NSMutableArray添加CGPoints。当我尝试打印该数组中的所有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]];
}
}
答案 0 :(得分:6)
您正在记录iOS愿意为您提供的每一点。
iOS仅报告触摸移动事件,每16.67毫秒(每秒60次)。 (据我所知)没有办法比这更快地获得更新的触摸位置。
你说在绘制触点时你会得到直线。发生这种情况是因为用户移动手指的速度非常快,以至于触摸在16.67毫秒内移动了很多。触摸在更新之间移动到目前为止,当您连接点时,它看起来不像一条平滑的曲线。不幸的是,(正如我所说),没有办法比每秒更快地获得60次更新。
处理此问题的唯一方法是使用样条插值来连接报告的点。样条插值是一个复杂的主题。您可以使用Google找到有关它的大量信息。
您可以在iPad上的Adobe Ideas应用中看到此示例。如果您快速绘制一个大螺旋并仔细观察,您可以看到当您抬起手指时线条变得更平滑。我相信它会在绘制螺旋时进行一些增量平滑,当你抬起手指时,它会向后移动并计算整条线的更好插值。