滞后,而在ios7绘图

我有一个应用程序,我正在做一些视图草图。

到目前为止,它工作正常,直到我安装了ios7

我的应用程序使用触摸移动的方法来识别运动的变化。 但是,当我画一条线,触摸方法被调用,但行不会更新,直到我触摸结束在ios7

所以绘图有一点点滞后。

它在ios6ios7模拟器上工作正常,但是当我在真正的ios7设备上testing时,绘图algorithm存在滞后性。

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (!isImageSelection) { mouseSwiped = NO; UITouch *touch = [touches anyObject]; if ( [touch view] != baseview) { lastPoint2 = [touch locationInView:self.viewDrawing2]; } } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { if (!isImageSelection) { // NSLog(@"in image selection==%d touch moved ",isImageSelection ); mouseSwiped = YES; UITouch *touch = [touches anyObject]; // if (([touch view] != btnInkColor) || ([touch view] != btnPenSize) || ([touch view] != baseview)) { if ( [touch view] != baseview) { CGPoint currentPoint = [touch locationInView:self.viewDrawing]; if(isEraser) { // [[NSUserDefaults standardUserDefaults] floatForKey:@"strokeValue"]; UIGraphicsBeginImageContext(self.viewDrawing.frame.size); [imgDrawing.image drawInRect:CGRectMake(0, 0, self.viewDrawing.frame.size.width, self.viewDrawing.frame.size.height)]; CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); CGContextSetLineWidth(UIGraphicsGetCurrentContext(), stroke); //uncommented by prerak CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0); CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear); CGContextBeginPath(UIGraphicsGetCurrentContext()); CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); CGContextStrokePath(UIGraphicsGetCurrentContext()); imgDrawing.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } else { float strokeT= [[NSUserDefaults standardUserDefaults] floatForKey:@"strokeValue"]; // NSLog(@"strokeT=%f",strokeT); UIGraphicsBeginImageContext(self.viewDrawing.frame.size); [imgDrawing.image drawInRect:CGRectMake(0, 0, self.viewDrawing.frame.size.width, self.viewDrawing.frame.size.height)]; // NSLog(@"STROKE %f",stroke); CGContextSetLineWidth(UIGraphicsGetCurrentContext(), strokeT); CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy); float redT=[[NSUserDefaults standardUserDefaults] floatForKey:@"redvalue"]; float greenT= [[NSUserDefaults standardUserDefaults] floatForKey:@"greenvalue"]; float blueT= [[NSUserDefaults standardUserDefaults] floatForKey:@"bluevalue"]; // NSLog(@"red=%f",redT); // NSLog(@"green=%f",greenT); // NSLog(@"blue=%f",blueT); CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), redT, greenT, blueT, 1.0); CGContextSetRGBFillColor(UIGraphicsGetCurrentContext(), redT, greenT, blueT, 1.0); CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinRound); CGContextBeginPath(UIGraphicsGetCurrentContext()); CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); CGContextStrokePath(UIGraphicsGetCurrentContext()); imgDrawing.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } lastPoint = currentPoint; } } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; //if (([touch view] != btnInkColor) || ([touch view] != btnPenSize) || ([touch view] != baseview)) { if ( [touch view] != baseview) { if (!isImageSelection) { if(!mouseSwiped) { if (isEraser) { UIGraphicsBeginImageContext(self.viewDrawing.frame.size); [imgDrawing.image drawInRect:CGRectMake(0, 0, self.viewDrawing.frame.size.width, self.viewDrawing.frame.size.height)]; CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); CGContextSetLineWidth(UIGraphicsGetCurrentContext(), stroke); // CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0); CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear); CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); CGContextStrokePath(UIGraphicsGetCurrentContext()); CGContextFlush(UIGraphicsGetCurrentContext()); imgDrawing.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } else { UIGraphicsBeginImageContext(self.viewDrawing.frame.size); [imgDrawing.image drawInRect:CGRectMake(0, 0, self.viewDrawing.frame.size.width, self.viewDrawing.frame.size.height)]; CGContextSetLineWidth(UIGraphicsGetCurrentContext(), stroke); CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy); CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0); CGContextSetRGBFillColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0); CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinRound); CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); CGContextStrokePath(UIGraphicsGetCurrentContext()); CGContextFlush(UIGraphicsGetCurrentContext()); imgDrawing.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } } } } } } 

我如何解决这个问题?

要find即时解决scheme,请replace此行

  mainImage.image = UIGraphicsGetImageFromContext(UIGraphicsGetCurrentContext()); 

 [mainImage performSelectorInBackground:@selector(setImage:) withObject:UIGraphicsGetImageFromCurrentImageContext()]; 

如果您需要精心准备的解决scheme,请尝试用CGMutablepathreplaceMoveTo。 希望这可以帮助。

我们已经使用dispatch_async(dispatch_get_main_queue(), ^{)};解决了这个问题dispatch_async(dispatch_get_main_queue(), ^{)};touchMoved方法中像这样touchMoved

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { dispatch_async(dispatch_get_main_queue(), ^{ mouseSwiped = YES; UITouch *touch = [touches anyObject]; if(touch.view==self.vwSwipePage) { return; } if(flagIsEraser) { CGPoint currentPoint; if(flagActiveViewPage) { currentPoint = [touch locationInView:self.mainImage]; UIGraphicsBeginImageContext(self.mainImage.frame.size); [self.mainImage.image drawInRect:CGRectMake(0, 0, self.mainImage.frame.size.width, self.mainImage.frame.size.height)]; } else { currentPoint = [touch locationInView:self.mainImage1]; UIGraphicsBeginImageContext(self.mainImage1.frame.size); [self.mainImage1.image drawInRect:CGRectMake(0, 0, self.mainImage1.frame.size.width, self.mainImage1.frame.size.height)]; } //clear using circle brush........ CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineCap(context, kCGLineCapRound); CGContextSetLineWidth(context,20); CGContextSetBlendMode(context, kCGBlendModeClear); CGContextSetStrokeColorWithColor(context, [[UIColor clearColor] CGColor]); CGContextBeginPath(context); CGContextMoveToPoint(context, lastPoint.x, lastPoint.y); CGContextAddLineToPoint(context, currentPoint.x, currentPoint.y); CGContextStrokePath(context); CGContextFlush(context); if(flagActiveViewPage) self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext(); else self.mainImage1.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); lastPoint = currentPoint; } }); } 

愿这将帮助你解决你的问题。

谢谢