CGContext奇怪

时间:2011-10-06 09:06:32

标签: ios cocoa-touch ipad uiimage cgcontextdrawimage

我有一个小代码模块应该作为签名面板引用,以便用户可以用他的手指在该面板上签名。整件事在iPad上运行。 现在,我设法做了通常的touchesBegan(),touchesMoved(),touchesEnded()轮播让他在那个面板上签名。在签名时,我在主视图上绘制了他的签名。但是,由于任何原因,图像出现两次:一次正确,一次倒置在主要签名上方(见图)。由于我没有在我的代码中看到任何翻译,我怀疑整个代码可能不正确,但我不知道为什么。有谁知道我在这里做错了什么?

enter image description here

#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

1 个答案:

答案 0 :(得分:1)

找到它.. Quartz在左下角而不是左上角有(0,0)。