2009-04-21 57 views
0

我有一個棘手的bug,我似乎無法弄清楚,我認爲它與touchesMoved的實現方式有關。touchesMoved和drawRect的問題

在touchesMoved中,我檢查觸摸位置(如果是語句),然後相應地在接觸點附近的40乘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

我想通了這個問題的答案。 touchX和touchY是實例變量,並且在每次調用drawRect完成之前,它們都會在touchesMoved中重置。因此,如果我在屏幕上快速移動,touchesMoved將被調用,然後調用drawRect,然後touchesMoved將在drawRect使用touchX和touchY之前再次調用,因此繪圖將與布爾數組後端不同步。

爲了解決這個問題,我停止在drawRect中使用touchX和touchY,並使用從touchesMoved傳入的髒矩形開始派生相同的點。

tada!

+0

髒rect是什麼意思? – 2014-02-07 14:20:12