CGContext描边路径在缩放和绘制图像时不起作用

时间:2012-02-14 17:15:11

标签: iphone ios uiimage core-graphics pinch

我根据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
  }
}

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

enter image description here

这是在放大后用红色箭头显示放大前已经绘制的片段(如上图所示)的图像。图像模糊不清:

enter image description here

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

编辑 - 我已上传a short video以显示正在发生的事情。这有点娱乐......

编辑2 - 此处a sample single-view app专注于此问题。

3 个答案:

答案 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)

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

  1. 您应该记住路径的所有坐标(MODEL)。
  2. 将您的路径绘制到imageView的临时子视图中。
  3. 当用户开始捏合/缩放图像时 - 什么都不做,即路径将由iOS缩放
  4. 在用户完成缩放缩放的那一刻 - 使用您的模型以正确的方式重绘您的路径。
  5. 如果将路径保存为图像,则会导致视图缩放。 另外 - 不直接绘制路径 - 在编辑结束时绘制到某些透明视图并将它们分割为

答案 2 :(得分:1)

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

有关示例,请参阅Drawing bezier curves with my finger in iOS?