1

私のアプリには、署名を描画できるUIView(CanvasView)内に含まれるViewControllerがあり(区別するために「Hi Little John」というラベルを追加しました)、カメラに触れてキャプチャを作成するために、その下にUIImageも追加しましたボタン

ここに画像の説明を入力

カメラボタンをタッチすると、UIView と UILabel のみがキャプチャされ、署名はキャプチャされません。

ここに画像の説明を入力

UIView クラス (CanvasView) と UIViewController の 2 つのクラスがあります。CanvasView には、スクリーンショット用の次のコードがあります。

@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

私のViewControllerのクラスには、イベントをトリガーするIBActionがあります

- (IBAction)captureSignature:(id)sender {

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

写真の署名をキャプチャしたいのですが、助けていただければ幸いです

前もって感謝します


***** 編集** 署名をレンダリングするためのコードもCanvasViewにあり、3 つの方法があります

  • (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)イベント
  • (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)イベント
  • (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)イベント

タッチが次の場合、イベントによって異なります。

  • はじめに (touchesBegan)
  • 動いているかどうか (touchesMoved)
  • または終了した場合 (touchesEnded)

ストロークをレンダリングするために、それらすべてが次の名前のメソッドを呼び出します。

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

必要に応じてさらに詳しく説明できますが、キャンバス上でストロークを作成するためのフレームワークであるため、少し長くなります。これらすべてのメソッドのコードは次のとおりです。

-(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];
}
4

0 に答える 0