0

Signature.h ファイル

#import <UIKit/UIKit.h>

@interface Signature : UIViewController
{

    CGPoint firstTouch;
    CGPoint lastTouch;
    UIColor *pointColor;
    CGRect *points;
    int npoints;
    CGPoint location;
   // UIImageView *signatureImageView;
}
 @property CGPoint firstTouch;
@property CGPoint lastTouch;
@property (nonatomic, retain) UIColor *pointColor;
@property CGRect *points;
@property int npoints;

@property (retain, nonatomic) IBOutletCollection(UIImageView) NSArray *drawSign;
@property CGPoint location;

@property (retain, nonatomic) IBOutletCollection(UIImageView) NSArray *signatureImageView;
- (IBAction)savePressed:(id)sender;
- (IBAction)clearPressed:(id)sender;

@end

Signature.m

#import "Signature.h"

@interface Signature ()

@end

@implementation Signature
@synthesize drawSign;
@synthesize signatureImageView;
@synthesize firstTouch;
@synthesize lastTouch;
@synthesize  pointColor;
@synthesize  points;


- (id)initWithFrame:(CGRect)frame
{
    return self;
}


- (id)initWithCoder:(NSCoder *)coder
{
    if(self = [super initWithCoder:coder])
    {
        self.npoints = 0;
    }
    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    NSLog(@"initwithnibname");
    return self;
}

- (void)viewDidLoad
{
    NSLog(@"viewdidload");

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)viewDidUnload
{
    NSLog(@"view did unload");

    [self setSignatureImageView:nil];
    [self setDrawSign:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touch has began");

    UITouch *touch = [touches anyObject];
    self.location = [touch locationInView:self.view];
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touches moves");

    UITouch *touch = [touches anyObject];
    CGPoint currentLocation = [touch locationInView:self.view];
   UIGraphicsBeginImageContext(self.view.frame.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();

  //[self.drawSign.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    CGContextSetLineCap(ctx, kCGLineCapRound);
    CGContextSetLineWidth(ctx, 5.0);
    CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);
    CGContextBeginPath(ctx);
    CGContextMoveToPoint(ctx, location.x, location.y);
    NSLog(@"%f x is",location.x);
     NSLog(@"%f y is",location.y);
    CGContextAddLineToPoint(ctx, currentLocation.x, currentLocation.y);
    CGContextStrokePath(ctx);
   // self.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    location = currentLocation;
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touches ended");

    UITouch *touch = [touches anyObject];
  CGPoint currentLocation = [touch locationInView:self.view];

   UIGraphicsBeginImageContext(self.view.frame.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //[self.view.image drawInRect:CGRectMake(0, 0, self.frame.view.size.width, self.frame.view.size.height)];
    CGContextSetLineCap(ctx, kCGLineCapRound);
    CGContextSetLineWidth(ctx, 5.0);
    CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);
    CGContextBeginPath(ctx);
    CGContextMoveToPoint(ctx, location.x, location.y);
   CGContextAddLineToPoint(ctx, currentLocation.x, currentLocation.y);
    CGContextStrokePath(ctx);
  //  self.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    location = currentLocation;
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)dealloc {
    [signatureImageView release];
    [super dealloc];
}
- (IBAction)savePressed:(id)sender {
    NSLog(@"save pressed");

}

- (IBAction)clearPressed:(id)sender {
    NSLog(@"cancel pressed");

}
@end

私のプロジェクトに関連する 2 つのファイルを見つけてください。一つの見方から、私はこの見方に来ています。ここで、ユーザーが描画したものをすべて保存する必要があります。座標を取得できますが、描画できません。私はいくつかの試みを試みましたが、どちらも機能していないようです.Signature.mファイル自体でコメント化された方法でそれらを見つけてください. 間違いを指摘して訂正してください。

4

1 に答える 1

1

私は本当にあなたの質問を理解していませんが、このコードが間違っている理由はタッチ部分にあります.

タッチしながら描画する場合は、描画するビューから drawInRect メソッドを使用する必要があります。

ユーザーが画像を解放した後に保存または表示するために画像を描画する場合は、 touchesBegan で画像コンテキストを作成し、次にtouchesMovedで描画し、最後に結果を touchesEnded に保存する必要あります。

touchesEndedで結果を抽出できます

UIImage *result = UIGraphicsGetImageFromCurrentImageContext();

コードが現在行っていることは、指を動かすたびに新しいキャンバスを作成し、それに描画して破棄することです。指を離すと、もう 1 つのキャンバス ドローが作成され、それも破棄されます。

しかし、指を動かして結果を画面に直接表示したいと確信しています。そのためには、Google でチュートリアルを参照することを強くお勧めしますが、基本的には、タッチの開始時にポイントの配列を作成し、タッチの移動時にこの配列にポイントを追加し、タッチの終了時に最後のポイントを配列に追加する必要があります。ビュー drawInRect の MEANWHILE コードは、この配列内のポイントを継続的に描画する必要があります。

編集:

self.drawSign.image の先頭に有効な UIImage (空白のキャンバスが既に初期化されている) があると 仮定します。

試す:

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touches moves");

    UITouch *touch = [touches anyObject];
    CGPoint currentLocation = [touch locationInView:self.view];
   UIGraphicsBeginImageContext(self.view.frame.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    [self.drawSign.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    CGContextSetLineCap(ctx, kCGLineCapRound);
    CGContextSetLineWidth(ctx, 5.0);
    CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);
    CGContextBeginPath(ctx);
    CGContextMoveToPoint(ctx, location.x, location.y);
    NSLog(@"%f x is",location.x);
     NSLog(@"%f y is",location.y);
    CGContextAddLineToPoint(ctx, currentLocation.x, currentLocation.y);
    CGContextStrokePath(ctx);
    self.drawSign.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    location = currentLocation;
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touches ended");

    UITouch *touch = [touches anyObject];
  CGPoint currentLocation = [touch locationInView:self.view];

   UIGraphicsBeginImageContext(self.view.frame.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [self.drawSign.image drawInRect:CGRectMake(0, 0, self.frame.view.size.width, self.frame.view.size.height)];
    CGContextSetLineCap(ctx, kCGLineCapRound);
    CGContextSetLineWidth(ctx, 5.0);
    CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);
    CGContextBeginPath(ctx);
    CGContextMoveToPoint(ctx, location.x, location.y);
   CGContextAddLineToPoint(ctx, currentLocation.x, currentLocation.y);
    CGContextStrokePath(ctx);
    self.drawSign.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    location = currentLocation;
} 

これが機能するかどうかはわかりませんが、機能する場合でも、それはひどい方法です(パフォーマンスに関して)。

于 2012-11-20T08:12:00.143 に答える