1

my app has a ViewController which contains inside a UIView (CanvasView) where you can draw your signature (I added a label "Hi Little John" to differentiate it), and I also added a UIImage below it for making a capture by touching a camera button

enter image description here

Now when I touch the camera button it only captures the UIView and UILabel but not the signature as it shows

enter image description here

I have a two classes: my UIView class (CanvasView) and my UIViewController, in my CanvasView I have this code for the screenshot:

@implementation CanvasView

-(UIImage *)getCanvasScreenshot{

    //first it makes an UIImage from the view
    UIGraphicsBeginImageContext(self.bounds.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *sourceImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //now it will position the image, X/Y away from top left corner to get the portion required
    UIGraphicsBeginImageContext(self.frame.size);

    [sourceImage drawAtPoint:CGPointMake(0, 0)];

    UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return croppedImage;
}

//some other code goes here...

@end

in my ViewController's class I have a my IBAction which triggers the event

- (IBAction)captureSignature:(id)sender {

    self.imageFirma.image = [canvasView getCanvasScreenshot];
}

I want to capture the signature on my picture any help I'll appreciate

thanks in advance


***** EDIT** the code for rendering the signature is in CanvasView as well, it's three methods

  • (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  • (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
  • (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

depending of the event if the touch is:

  • at the begining (touchesBegan)
  • if is it moving (touchesMoved)
  • or if is finished (touchesEnded)

for rendering the stroke all of them call to a method named:

  • (void) addLineToAndRenderStroke:(SmoothStroke*)currentStroke toPoint:(CGPoint)end toWidth:(CGFloat)width toColor:(UIColor*)color

I can go deeper if you want but it's kinda long because it is a framework for making strokes on the canvas, and the code of all these methods are:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    if(![JotStylusManager sharedInstance].enabled){
        for (UITouch *touch in touches) {
            [self addLineToAndRenderStroke:[self getStrokeForTouchHash:touch.hash]
                                   toPoint:[touch locationInView:self]
                                   toWidth:[self widthForPressure:JOT_MIN_PRESSURE]
                                   toColor:[self colorForPressure:JOT_MIN_PRESSURE]];

        }
    }
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{


    if(![JotStylusManager sharedInstance].enabled){
        for (UITouch *touch in touches) {
            // check for other brands of stylus,
            // or process non-Jot touches
            //
            // for this example, we'll simply draw every touch if
            // the jot sdk is not enabled
            [self addLineToAndRenderStroke:[self getStrokeForTouchHash:touch.hash]
                                   toPoint:[touch locationInView:self]
                                   toWidth:[self widthForPressure:JOT_MIN_PRESSURE]
                                   toColor:[self colorForPressure:JOT_MIN_PRESSURE]];

        }
    }
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

    if(![JotStylusManager sharedInstance].enabled){
        for(UITouch* touch in touches){
            SmoothStroke* currentStroke = [self getStrokeForTouchHash:touch.hash];

            // now line to the end of the stroke
            [self addLineToAndRenderStroke:currentStroke
                                   toPoint:[touch locationInView:self]
                                   toWidth:[self widthForPressure:JOT_MIN_PRESSURE]
                                   toColor:[self colorForPressure:JOT_MIN_PRESSURE]];

            // this stroke is now finished, so add it to our completed strokes stack
            // and remove it from the current strokes, and reset our undo state if any
            [_stackOfStrokes addObject:currentStroke];
            [currentStrokes removeObjectForKey:@([touch hash])];
            [stackOfUndoneStrokes removeAllObjects];
        }
    }
}


- (void) addLineToAndRenderStroke:(SmoothStroke*)currentStroke toPoint:(CGPoint)end toWidth:(CGFloat)width toColor:(UIColor*)color{

    // fetch the current and previous elements
    // of the stroke. these will help us
    // step over their length for drawing
    AbstractBezierPathElement* previousElement = [currentStroke.segments lastObject];

    // Convert touch point from UIView referential to OpenGL one (upside-down flip)
    end.y = self.bounds.size.height - end.y;
    if(![currentStroke addPoint:end withWidth:width andColor:color]) return;

    //
    // ok, now we have the current + previous stroke segment
    // so let's set to drawing it!
    [self renderElement:[currentStroke.segments lastObject] fromPreviousElement:previousElement includeOpenGLPrep:YES];
}
Jesús Ayala
  • 2,743
  • 3
  • 32
  • 48

0 Answers0