Проблема с прикосновениямиMoved и drawRect - PullRequest
0 голосов
/ 22 апреля 2009

У меня есть липкая ошибка, которую я, кажется, не могу понять, и я думаю, что это как-то связано с тем, как реализована технология touchchesMoved.

in touchesMoved, я проверяю, где находится касание (оператор if), а затем соответственно вызываю setNeedsDisplayWithRect в области 40 на 40 около точки касания. В 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))]; 


}

1 Ответ

0 голосов
/ 25 апреля 2009

Я разобрался с ответом на это. touchX и touchY были переменными экземпляра, и они сбрасывались в touchesMoved перед завершением каждого вызова drawRect. Следовательно, если бы я быстро двигался по экрану, то вызывался touchesMoved, а затем вызывался drawRect, а затем вызывался бы touchesMoved, прежде чем drawRect использовал touchX и touchY, поэтому рисунок не синхронизировался с бэкэндом логического массива.

, чтобы решить эту проблему, я перестал использовать touchX и touchY в drawRect и начал выводить ту же точку, используя грязный прямоугольник, передаваемый из touchesMoved.

тада!

...