0

我有一个区域,用户可以将他们的签名添加到应用程序中,以验证订单。
他们用触摸签名。
唯一的问题是,签名的框架很大,如果用户要让签名非常小,当我保存图像时,我会在图像周围留下大量空白空间,当我添加时将其发送到电子邮件中,该过程可能看起来很糟糕。

有什么办法,使用它我可以将图像裁剪到实际内容的边界,而不是框本身的边界?

我想这个过程将涉及以某种方式检测空间内的内容并绘制一个 CGRect 以匹配它的边界,然后再将此 CGRect 传递回上下文?但我不知道如何以任何形式或形式进行此操作,这确实是我第一次使用 CGContext 和图形框架。

这是我的签名绘图代码:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];   
    CGPoint currentPoint = [touch locationInView:signView];

    //Define Properties
    [drawView.image drawInRect:CGRectMake(0, 0, drawView.frame.size.width, drawView.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinBevel);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0);
    CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), true);
    CGContextSetAllowsAntialiasing(UIGraphicsGetCurrentContext(), true);

    //Start Path
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());

    //Save Path to Image
    drawView.image = UIGraphicsGetImageFromCurrentImageContext();

    lastPoint = currentPoint;

}

如果你能提供它,谢谢你的帮助。

4

1 回答 1

0

您可以通过跟踪最小和最大触摸值来做到这一点。

例如,制作一些最小/最大 ivars

    @interface ViewController () {
      CGFloat touchRectMinX_;
      CGFloat touchRectMinY_;
      CGFloat touchRectMaxX_;
      CGFloat touchRectMaxY_;
      UIView *demoView_;
    }
    @end

这是一个演示矩形

    - (void)viewDidLoad {
      [super viewDidLoad];
      demoView_  = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
      demoView_.backgroundColor = [UIColor redColor];
      [self.view addSubview:demoView_];  
    }

用不可能的值设置它们。您需要为每个签名而不是每个笔划执行此操作,但如何执行此操作取决于您。假设您有一个清除按钮,我建议重置“清除”。

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
      touchRectMinX_ = CGFLOAT_MAX;
      touchRectMinY_ = CGFLOAT_MAX;
      touchRectMaxX_ = CGFLOAT_MIN;
      touchRectMaxY_ = CGFLOAT_MIN;
    }

现在记录更改

    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
      UITouch *touch = [touches anyObject];   
      CGPoint currentPoint = [touch locationInView:self.view];

      touchRectMinX_ = MIN(touchRectMinX_, currentPoint.x);
      touchRectMinY_ = MIN(touchRectMinY_, currentPoint.y);  
      touchRectMaxX_ = MAX(touchRectMaxX_, currentPoint.x);
      touchRectMaxY_ = MAX(touchRectMaxY_, currentPoint.y);   

      // You can use them like this:
      CGRect rect = CGRectMake(touchRectMinX_, touchRectMinY_, fabs(touchRectMinX_ - touchRectMaxX_), fabs(touchRectMinY_ - touchRectMaxY_));
      demoView_.frame = rect;
      NSLog(@"Signature rect is: %@", NSStringFromCGRect(rect));
    }

希望这可以帮助!

于 2012-04-25T13:30:04.003 回答