ユーザーが指でこのパネルに署名できるように、署名パネルと呼ばれる小さなコード モジュールがあります。すべてが iPad 上で実行されます。これで、通常の touchesBegan()、touchesMoved()、touchesEnded() カルーセルを実行して、そのパネルにサインさせることができました。署名するときは、メイン ビューに彼の署名を描きます。ただし、何らかの理由で、画像が 2 回表示されます。1 回目は正しく表示され、もう 1 回はメインの署名の上に上下逆さまになっています (画像を参照)。私のコードでは翻訳が行われていないので、コード全体が間違っているのではないかと思いますが、その理由はわかりません。ここで私が間違っていることを誰かが知っていますか?
#import "RMSignatureView.h"
#import <QuartzCore/QuartzCore.h>
@interface RMSignatureView() {
CGPoint origin;
}
-(void) setupLayer;
@property (nonatomic, retain) UIImage* image;
@end
@implementation RMSignatureView
@synthesize image;
-(void) dealloc {
[image release];
[super dealloc];
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setupLayer];
}
return self;
}
-(id) initWithCoder:(NSCoder *)aDecoder {
if ([super initWithCoder:aDecoder] == self) {
[self setupLayer];
}
return self;
}
-(void) setupLayer {
self.layer.cornerRadius = 10;
self.layer.borderColor = [UIColor colorWithRed:109.0/256.0 green:149.0/256.0 blue:224.0/256.0 alpha:1.0].CGColor;
self.layer.borderWidth = 0.5f;
}
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextSetStrokeColorWithColor(context, [UIColor grayColor].CGColor);
CGFloat sizes[2];
sizes[0] = 1;
sizes[1] = 1;
CGContextSetLineDash(context, 0, sizes, 2);
CGContextMoveToPoint(context, rect.origin.x + 50, rect.origin.y + rect.size.height - 30);
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width - 50, rect.origin.y + rect.size.height - 30);
CGContextStrokePath(context);
CGContextSetLineDash(context, 0, NULL, 0);
if (image)
CGContextDrawImage(context, rect, image.CGImage);
CGContextRestoreGState(context);
}
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch* touch = [touches anyObject];
origin = [touch locationInView:self];
}
-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
origin.x = -1;
origin.y = -1;
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
origin.x = -1;
origin.y = -1;
}
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch* touch = [touches anyObject];
if (origin.x != -1 && origin.y != -1) {
UIGraphicsBeginImageContext(self.frame.size);
@try {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
if (image)
CGContextDrawImage(context, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), image.CGImage);
CGContextMoveToPoint(context, origin.x, origin.y);
origin = [touch locationInView:self];
CGContextAddLineToPoint(context, origin.x, origin.y);
CGContextStrokePath(context);
self.image = UIGraphicsGetImageFromCurrentImageContext();
CGContextRestoreGState(context);
}
@finally {
UIGraphicsEndImageContext();
}
}
[self setNeedsDisplay];
}
@end