Вопрос

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

в 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))];
        }
    }
}

Моя проблема в том, что логический массив, похоже, не соответствует изображениям, которые я размещаю.Это происходит только в том случае, если я очень быстро перемещаю курсор по экрану.В конце концов логический массив и изображения больше не синхронизированы, хотя я установил их одновременно.Есть какие-нибудь идеи, что является причиной этого, или что я могу сделать, чтобы это исправить?

Вот мой розыгрыш.:

- (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))]; 


}
Это было полезно?

Решение

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

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

tada!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top