Iphone SDK接触事件

时间:2009-10-20 23:43:54

标签: iphone cocoa-touch

我试图通过写一些能跟踪触摸的衬垫来更好地理解触摸:

- (void)drawRect:(CGRect)rect {
NSLog (@"My draw");

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 2);
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);

CGContextMoveToPoint(context, prev.x, prev.y);
CGContextAddLineToPoint(context, cur.x, cur.y);
    CGContextStrokePath(context);
return;
}

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

UITouch *touch = [touches anyObject];
prev = [touch previousLocationInView:self];
cur = [touch    locationInView:self];

[self setNeedsDisplayInRect:CGRectMake (prev.x, prev.y, fabs (cur.x-prev.x), fabs (cur.y - prev.y) )];
}

很明显我的setNeedsDisplay不正确,因为它只适用于从正坐标到负坐标(从左上角到右下角)的移动。有了这个问题:

  1. 似乎我必须为4种不同的潜在移动方向(从pos X,Y到neg X,Y,从pos X到neg X等)单独写setNeedsDisplay。这是一种正确的方法,还是我缺少一些基本的方法?

  2. 即使是正确的移动,线条也不是固定的,而是断开的(取决于手指跟踪的速度)。为什么不是实线跟踪运动?

  3. 谢谢!

2 个答案:

答案 0 :(得分:1)

setNeedsDisplay未立即致电drawRect。实际上,在下次绘制视图之前,可能会多次调用touchesMoved,这就是您看到折线的原因。

答案 1 :(得分:0)

您对CGRectMake的调用应该是:

CGRectMake (MIN(cur.x, prev.x), MIN (cur.y, prev.y), fabs (cur.x-prev.x), fabs (cur.y - prev.y))

在我的代码中,我将其概括为一个函数,从任意两点产生一个矩形,例如:

CGRect rectWithPoints(CGPoint a, CGPoint b)
{
return CGRectMake(
   MIN (a.x, b.x),  
   MIN (a.y, b.y), 
   fabs (a.x - b.x), 
   fabs (a.y - b.y));
}