6

我正在根据touchesMoved:方法画线,通常效果很好。但是当我放大图像并进行绘制时,之前绘制的线条都发生了位移,并且越来越模糊,最终消失了。我已经尝试使用UIPinchGestureRecognizer并简单地增加frameof 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
  }
}

这是在没有缩放的情况下绘制的图像:

在此处输入图像描述

这是放大后描述问题的图像,红色箭头显示在放大之前已经绘制的段(如上图所示)。图像既模糊又移位:

在此处输入图像描述

还可以注意到,向末端绘制的线的一部分不受影响,并且在时间线向后绘制时会出现这种现象。我相信这样做的原因是当我放大/缩小时图像尺寸属性会丢失,这可能会导致模糊和移位,但我不确定!

编辑- 我上传了一个简短的视频来展示正在发生的事情。这有点有趣...

编辑 2-这是一个专注于该问题的示例单视图应用程序。

4

3 回答 3

4

我下载了您的项目,发现问题在于自动调整大小。以下步骤将解决它:

步骤 1.注释第 70 行:

drawImage.frame = CGRectMake(0, 0, labOrderImgView.frame.size.width, labOrderImgView.frame.size.height);

在你的touchesMoved方法中。

步骤 2.在方法中对 drawImage 进行编辑后添加一行代码alloc(第 90 行)viewDidLoad

drawImage.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

然后,该错误被修复。

于 2012-05-16T05:55:16.023 回答
1

我以下面的方式实现了这样的行为:

  1. 您应该记住路径的所有坐标(模型)。
  2. 将您的路径绘制到 imageView 的临时子视图中。
  3. 当用户开始捏/缩放您的图像时 - 什么都不做,即 iOS 将缩放路径
  4. 在用户完成捏缩放的那一刻 - 使用您的模型以正确的方式重绘您的路径。

如果将路径另存为图像,结果会导致缩放效果不佳。另外 -不要直接绘制图像路径- 绘制到一些透明视图并在编辑结束时将它们拆分在一起。

于 2012-02-14T18:22:06.837 回答
1

您总是只是在图像上下文中绘制图像视图的大小 - 这当然会变得模糊,因为放大时您不会适应更高的分辨率。改为创建UIBezierPath一次并添加一条线会更明智在方法中对其(使用addLineToPoint:touchesMoved,然后drawRect通过自定义方法将其绘制[bezierPath stroke]。您也可以只添加 aCAShapeLayer作为图像视图的子视图,并将其path属性设置为您之前创建的CGPath属性。bezierPath

请参阅在 iOS 中用手指绘制贝塞尔曲线?例如。

于 2012-02-14T19:11:04.523 回答