Сенсорные события в UIView

Я делаю приложение для рисования в iOS. Я дам краткое изложение логики здесь,

1.Инициализировать растровое изображение
2.Всякий раз, когда обнаруживается событие touchBegan или touchMoved , я рисую заполненный CGRect в этой позиции растрового изображения, и растровое изображение отображается на экране.

Работает отлично, за исключением небольшой проблемы. Если я двигаю мышь в симуляторе очень быстро, я не получаю непрерывный ход. Это просто серия несвязанных CGRects. Я провел некоторое исследование, которое показало, что в iOS события касания запускаются только каждые 16 миллисекунд, но я не думаю, что двигаю мышь так быстро. Так проблема в симуляторе или в моем коде?

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{    

       CGPoint touchPoint=[touch locationInView:self];

       CGContextFillRect (currentBitmap, CGRectMake (touchPoint.x -8 , touchPoint.y - 8   , rectangularBrushSize, rectangularBrushSize ));

       [self setNeedsDisplay]; //draw currentBitmap to screen

}

Код для touchesMoved такой же. Метод draw rect рисует currentBitmap на экране. Я хотел бы еще раз добавить, что он отлично работает, когда я двигаю мышь со средней скоростью.


person Samhan Salahuddin    schedule 07.09.2012    source источник


Ответы (2)


Вы должны попробовать использовать CGContextMoveToPoint и CGContextAddLineToPoint для создания приложения для рисования. В противном случае ваша линия не будет выглядеть гладкой.

* Я написал приложение таким образом, и у меня не было такой проблемы, как у вас.

person mineschan    schedule 07.09.2012

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

In touchesBegan:

lastPosition = [[touches anyObject] locationInView:self];

In touchesMoved:

currentPosition = [[touches anyObject] locationInView:self];
CGContextMoveToPoint(context, lastPosition);
CGContextAddLineToPoint(context, currentPosition);
// Draw the line with the desired color and width here.
lastPosition = currentPosition;
person DrummerB    schedule 07.09.2012
comment
Я думаю, что вы правы, но не могли бы вы объяснить, почему это так? У меня сложилось впечатление, что когда мы касаемся и перетаскиваем, touchEvents будет запускаться для каждой промежуточной точки, и, следовательно, мы всегда будем получать непрерывный ход. - person Samhan Salahuddin; 07.09.2012
comment
соединение точек кривой даст более естественный результат, нет? Рисование кривой/линии после обнаружения точек приведет к задержке, верно? - person Samhan Salahuddin; 07.09.2012
comment
Это технически невозможно. В мире компьютеров у вас (почти) всегда есть дискретное представление реального мира. В этом случае сенсорный экран регистрирует взаимодействие каждые несколько миллисекунд. Он не может угадать, к каким пикселям вы прикоснулись между этими точками. - person DrummerB; 07.09.2012
comment
Да, кривая может быть лучшим выбором, но ее гораздо сложнее реализовать. Я не вижу, где может быть какая-либо задержка в приведенной выше реализации. Вы также можете нарисовать точку/прямоугольник в touchesBegan:, если хотите. - person DrummerB; 07.09.2012