0

ユーザーが指でこのパネルに署名できるように、署名パネルと呼ばれる小さなコード モジュールがあります。すべてが 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
4

1 に答える 1

1

見つかった.. Quartz は左上ではなく左下に (0, 0) があります。

于 2012-05-30T07:43:13.107 に答える