我试图通过写一些能跟踪触摸的衬垫来更好地理解触摸:
- (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不正确,因为它只适用于从正坐标到负坐标(从左上角到右下角)的移动。有了这个问题:
似乎我必须为4种不同的潜在移动方向(从pos X,Y到neg X,Y,从pos X到neg X等)单独写setNeedsDisplay。这是一种正确的方法,还是我缺少一些基本的方法?
即使是正确的移动,线条也不是固定的,而是断开的(取决于手指跟踪的速度)。为什么不是实线跟踪运动?
谢谢!
答案 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));
}