我最近使我的应用程序与最新的视网膜iPad兼容,但我的图纸变得模糊不清。然后我尝试更改了contextWithOptions,但是当我画画时它变得非常迟钝和锯齿状。我尝试过的一切都行不通。有什么想法吗?
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
mouseSwiped = YES;
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:self.view];
if (UIGraphicsBeginImageContextWithOptions != NULL) {
UIGraphicsBeginImageContextWithOptions((self.view.frame.size), NO, 1);
//becomes laggy if I set it to 0 or 2. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
} else {
UIGraphicsBeginImageContext(self.view.frame.size);
}
[self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush );
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0);
CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal);
CGContextStrokePath(UIGraphicsGetCurrentContext());
self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
[self.tempDrawImage setAlpha:opacity];
UIGraphicsEndImageContext();
lastPoint = currentPoint;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if(!mouseSwiped) {
UIGraphicsBeginImageContext(self.view.frame.size);
[self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, opacity);
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
CGContextFlush(UIGraphicsGetCurrentContext());
self.tempDrawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
UIGraphicsBeginImageContextWithOptions((self.view.frame.size), NO, 0);
[self.mainImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:1.0];
[self.tempDrawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) blendMode:kCGBlendModeNormal alpha:opacity];
self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext();
self.tempDrawImage.image = nil;
UIGraphicsEndImageContext();
}
也许我应该在用户结束触摸时更改图像?有什么帮助吗?
答案 0 :(得分:1)
正确,您不想尝试为视图中的每次触摸创建图像。你只想画出你的路径。或者,更准确地说,您希望您的触摸手势(a)更新您的模型,该模型由一堆路径数组成(每条路径本身就是一个点数组); (b)调用必要的调用来更新更新模型的UI。
要渲染图纸,您有两种基本方法:
创建一个UIView
子类,该子类具有drawRect
方法,该方法遍历您的一系列路径并绘制它们;或
创建一个使用您的路径的CAShapeLayer
,然后[self.view.layer addSublayer:layer]
。
两种技术都没问题。但请注意,在这些技巧中,您都不会在手势中执行任何UIGraphicsBeginImageContext
,UIGraphicsGetImageFromCurrentImageContext
和UIGraphicsEndImageContext
。只有当你想将图形保存为图像时(大概是在完成用户的绘图手势之后),才能这样做。
但是如果你这样做,即使在视网膜屏幕上,你也可以毫不费力地跟上用户的手势。操作图像是一个缓慢且内存效率低的过程,所以你只想谨慎地做到这一点。
顺便说一句,如果你将这一系列路径作为绘图模型的核心部分,那么它也会带来其他机会。例如,很容易"撤消"一个路径,只需从模型中删除该路径对象并重新渲染视图即可。但如果你把它保存为图像,删除几个stokes变得不切实际。
最后,你必须决定你的应用程序是否是一个矢量绘图应用程序(你保存的文件是路径数组,也可能是保存图像的选项)或者它是否更多一个位图编辑器(最后,你丢弃矢量信息,只保存位图)。无论采用哪种方法,在手势期间使用路径对象都可能使UI更具响应性。