2012-03-01 6 views
1

Я хочу сохранить путь движения пальца на экране iPhone. На данный момент я просто читаю штрихи и добавляю CGPoints в NSMutableArray. когда я пытаюсь напечатать все cgpoint в этом массиве, как он пропускает промежуточные точки. Есть ли лучший способ этого? Можем ли мы хранить весь путь напрямую?Как сохранить путь движения пальца в объективе c?

Вот код, который я использую

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

fingerSwiped = NO; 
UITouch *touch = [touches anyObject]; 
lastPoint = [touch locationInView:self.view]; 
[self.myPoints addObject:[NSValue valueWithCGPoint:lastPoint]]; 
    } 


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
fingerSwiped = YES; 

UITouch *touch = [touches anyObject]; 
CGPoint currentPoint = [touch locationInView:self.view]; 



UIGraphicsBeginImageContext(self.view.frame.size); 
[slateImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), lineWidth); 
//CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(),0,0,0, 1.0); 
CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), self.drawcolor.CGColor); 
CGContextBeginPath(UIGraphicsGetCurrentContext()); 
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
CGContextStrokePath(UIGraphicsGetCurrentContext()); 
slateImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
lastPoint = currentPoint; 
[myPoints addObject:[NSValue valueWithCGPoint:lastPoint]]; 
} 

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

if(!fingerSwiped) 
{ 
    UIGraphicsBeginImageContext(self.view.frame.size); 
    [slateImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), lineWidth); 
    //CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(),0,0,0, 1.0); 
    CGContextSetStrokeColorWithColor(UIGraphicsGetCurrentContext(), self.drawcolor.CGColor); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    CGContextFlush(UIGraphicsGetCurrentContext()); 
    slateImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    [myPoints addObject:[NSValue valueWithCGPoint:lastPoint]]; 
} 
} 
+0

Можете ли вы поделиться кодом, в котором вы добавляете точки в массив – dbrajkovic

+0

Я забыл об этом раньше. – slonkar

+2

Почему, по вашему мнению, отсутствуют промежуточные точки? Кроме того, вы хотите очистить массив 'myPoints' в' touchhesBegan: withEvent: '? –

ответ

6

Вы записываете каждый пункт, что IOS готов дать вам.

iOS сообщает только события с сенсорным перемещением каждые 16,67 миллисекунды (60 раз в секунду). Нет (насколько я знаю), чтобы быстрее обновить места касания.

Вы говорите, что получаете прямые линии при построении точек касания. Это происходит потому, что пользователь так быстро перемещает свой палец, что прикосновение перемещается на значительное количество в 16,67 миллисекундах. Прикосновение движется до сих пор между обновлениями, которые при подключении точек не выглядят как плавная кривая. К сожалению, нет (как я уже сказал) возможности получать обновления быстрее, чем 60 раз в секунду.

Единственный способ справиться с этим - использовать сплайн-интерполяцию для подключения сообщенных точек. Сплайн-интерполяция - сложный вопрос. Вы можете найти много информации об этом с помощью Google.

Вы можете увидеть пример этого в приложении Adobe Ideas на iPad. Если вы нарисуете большую спираль быстро и внимательно следите, вы увидите, что линия становится более гладкой, когда вы поднимаете палец. Я считаю, что он делает некоторое постепенное сглаживание, когда вы рисуете спираль, и когда вы поднимаете палец, он возвращается и вычисляет лучшую интерполяцию всей линии.

+1

Спасибо за указатель. Но дело в том, что мне не хватает очков, только если я рисую точки из массива. Фактически, я передаю этот массив на другое устройство через сеть adhoc bluetooth, используя GKSession и пытаюсь восстановить его на другом устройстве. – slonkar