我根据touchesMoved:
方法绘制线条,通常它工作正常。但是当我放大图像并绘制时,先前绘制的线条都会移位并且越来越模糊,最终消失。我尝试使用UIPinchGestureRecognizer
并简单地增加frame
myImageView
(仅适用于多点触控事件),但问题是双向发生的。这是绘图的代码:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
NSArray *allTouches = [touches allObjects];
int count = [allTouches count];
if(count==1){//single touch case for drawing line
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:myImageView];
UIGraphicsBeginImageContext(myImageView.frame.size);
[drawImage.image drawInRect:CGRectMake(0, 0, myImageView.frame.size.width, myImageView.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 2.0);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
lastPoint = currentPoint;
}
else{//multi touch case
// handle pinch/zoom
}
}
这是在没有缩放的情况下绘制的图像:
这是在放大后用红色箭头显示放大前已经绘制的片段(如上图所示)的图像。图像模糊不清:
还可以注意到,朝向末端绘制的线的一部分不受影响,并且对于在时间上拉回的线发生现象。我相信这样做的原因是当我放大/缩小时图像尺寸属性会丢失,这可能会导致模糊和移位,但我对此并不确定!
编辑 - 我已上传a short video以显示正在发生的事情。这有点娱乐......
编辑2 - 此处a sample single-view app专注于此问题。
答案 0 :(得分:4)
我下载了你的项目,我发现问题是自动调整。以下步骤将解决它:
第1步。评论第70行:
drawImage.frame = CGRectMake(0, 0, labOrderImgView.frame.size.width, labOrderImgView.frame.size.height);
在touchesMoved
方法中。
第2步。在alloc
方法中,在{I} viewDidLoad
版(第90行)后添加一行代码:
drawImage.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
然后,修复了错误。
答案 1 :(得分:1)
我以下一种方式实现了这样的行为:
如果将路径保存为图像,则会导致视图缩放。 另外 - 不直接绘制路径 - 在编辑结束时绘制到某些透明视图并将它们分割为。
答案 2 :(得分:1)
您总是只是绘制到图像视图大小的图像上下文 - 这当然会变得模糊,因为您在放大时不会适应更高的分辨率。相反,创建{{1}更为明智只需在UIBezierPath
方法中为其添加一行(使用addLineToPoint:
),然后通过touchesMoved
以自定义drawRect
方法绘制。您也可以添加[bezierPath stroke]
作为图片视图的子视图,并将其CAShapeLayer
属性设置为您之前创建的path
的{{1}}属性。