2012-03-01 58 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 2012-03-01 06:01:58

+0

我之前就忘記了這一點。 – slonkar 2012-03-01 06:06:14

+2

你爲什麼認爲它缺少中間點?另外,你是否想清除'touchesBegan:withEvent:'中的'myPoints'數組? – 2012-03-01 06:08:59

回答

6

您記錄每一個點的iOS是願意給你的代碼。

iOS只會每16.67毫秒報告觸摸移動事件(每秒60次)。 (據我所知)沒有辦法更快地獲得更新的觸摸位置。

你說繪製觸摸點時你會得到直線。發生這種情況是因爲用戶移動手指的速度太快,以至於觸摸在16.67毫秒內移動了大量數據。觸摸在更新之間移動得非常快,當您連接點時,它看起來不像一條光滑的曲線。不幸的是,(正如我所說)沒有辦法以每秒60次以上的速度獲得更新。

解決此問題的唯一方法是使用樣條插值來連接報告的點。樣條插值是一個複雜的主題。您可以使用Google找到許多關於它的信息。

您可以在iPad上的Adobe Ideas應用程序中看到此示例。如果您快速繪製大螺旋並仔細觀察,則可以看到當您擡起手指時線條變得更加平滑。我相信在繪製螺旋線時它會進行一些漸進式平滑處理,而當您擡起手指時,它會返回並計算整個線條的更好插值。

+1

感謝您的指針。但事情是我只是在繪製數組中的點時錯過了這些點。實際上,我通過使用GKSession的藍牙adhoc網絡將該陣列傳遞給其他設備,並嘗試在其他設備上重新生成該陣列。 – slonkar 2012-03-01 16:52:08