Проблема с touchesMoved и drawRect
-
13-09-2019 - |
Вопрос
У меня есть неприятная ошибка, которую я, кажется, не могу разгадать, и я думаю, что это как-то связано со способом реализации 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!