我有一个我似乎无法弄清楚的粘性错误,我认为它与touchesMoved的实现方式有关。
在touchesMoved中,我检查触摸的位置(if语句),然后在接触点附近的40 x 40区域调用setNeedsDisplayWithRect。 DrawRect中发生的情况是,如果之前有白色图像,则放下黑色图像,反之亦然。同时我正在调用setNeedsDisplayWithRect,我在布尔数组中设置一个布尔变量,所以我可以跟踪当前图像是什么,因此显示相反的结果。 (实际上,我并不总是翻转图像......我看看第一次触摸会做什么,比如从黑色切换到白色,然后在所有后续触摸上放置白色图像,所以它有点像绘图或删除图像)。
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:self];
CGPoint lastTouchPoint = [touch previousLocationInView:self];
touchX = touchPoint.x;
touchY = touchPoint.y;
int lastX = (int)floor((lastTouchPoint.x+0.001)/40);
int lastY = (int)floor((lastTouchPoint.y+0.001)/40);
int currentX = (int)(floor((touchPoint.x+0.001)/40));
int currentY = (int)(floor((touchPoint.y+0.001)/40));
if ((abs((currentX-lastX)) >=1) || (abs((currentY-lastY)) >=1))
{
if ([soundArray buttonStateForRow:currentX column:currentY] == firstTouchColor){
[soundArray setButtonState:!firstTouchColor row:(int)(floor((touchPoint.x+0.001)/40)) column:(int)(floor((touchPoint.y+0.001)/40))];
[self setNeedsDisplayInRect:(CGRectMake((CGFloat)(floor((touchPoint.x+0.001)/40)*40), (CGFloat)(floor((touchPoint.y+0.001)/40)*40), (CGFloat)40.0, (CGFloat)40.0))];
}
}
}
我的问题是布尔数组似乎与我放下的图像不一致。只有当我在屏幕上快速拖动时才会发生这种情况。最终布尔数组和图像不再同步,即使我同时设置它们。知道造成这种情况的原因,或者我能做些什么来修复它?
这是我的drawRect:
- (void)drawRect:(CGRect)rect {
if ([soundArray buttonStateForRow:(int)(floor((touchX+0.001)/40)) column:(int)(floor((touchY+0.001)/40))])
[whiteImage drawAtPoint:(CGPointMake((CGFloat)(floor((touchX+0.001)/40)*40), (CGFloat)(floor((touchY+0.001)/40))*40))];
else
[blackImage drawAtPoint:(CGPointMake((CGFloat)(floor((touchX+0.001)/40)*40), (CGFloat)(floor((touchY+0.001)/40))*40))];
}
答案 0 :(得分:0)
我找到了答案。 touchX和touchY是实例变量,在每次调用drawRect之前,它们都在touchesMoved中重置。因此,如果我在屏幕上快速移动,则会调用touchesMoved,然后调用drawRect,然后在drawRect使用touchX和touchY之前再次调用touchesMoved,因此绘图将与布尔数组后端不同步。
为了解决这个问题,我在drawRect中停止使用touchX和touchY,并开始使用从touchesMoved传入的脏矩形来获得相同的点。
多田!