1

一連のタッチに元に戻す/やり直し機能を追加しようとしています。

私はtouchesBeganと移動のためのこのコードを持っています:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"%s", __FUNCTION__);
    mouseSwiped = NO;
    UITouch *touch = [touches anyObject];

    if ([touch tapCount] == 2) {
        [self eraseButtonTapped:self];
        return;
    }

    lastPoint = [touch locationInView:self.view];
    lastPoint.y -= 20;

    [self.undoPath addObject:WHATGOESHERE];
    // Remove all paths from redo stack
    [self.redoStack removeAllObjects];

}


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    //NSLog(@"%s", __FUNCTION__);
    mouseSwiped = YES;

    UITouch *touch = [touches anyObject];   
    CGPoint currentPoint = [touch locationInView:self.view];
    currentPoint.y -= 20;



    UIGraphicsBeginImageContext(self.view.frame.size);
    [drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, brush);
    CGContextSetRGBStrokeColor(context, red, green, blue, 1.0);
    CGContextBeginPath(context);
    CGContextMoveToPoint(context, lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(context, currentPoint.x, currentPoint.y);
    CGContextStrokePath(context);
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    [self.undoPath addObject:WHATGOESHERE];
    UIGraphicsEndImageContext();


    NSLog(@"Touches Moved undoPath contains %i objects", [self.undoPath count]);
    // Remove all paths from redo stack
    [self.redoPath removeAllObjects];
    lastPoint = currentPoint;


}

元に戻すスタックにデータを入力する方法がわかれば、スタックを繰り返し処理して、やり直しのタッチを元に戻すことができると思います。たぶん、私はすべて濡れています。私は確かにいくつかの助けをいただければ幸いです...

ありがとう

..以前にも同様の質問をしましたが、最後の方法では不十分だったため、別の形式でプロジェクトを再開しました。

4

1 に答える 1

0

私はついにアレイを管理することでこれを解決しました。

ストロークごとに、バッファ配列に追加されます。

[self.currentColoredPath.path moveToPoint:[touch locationInView:self]];
[self.currentArray addObject:self.currentColoredPath];
// Remove all paths from redo stack
[self.redoStack removeAllObjects];

次に、元に戻すメソッドとやり直しメソッドは次のようになります。

-(void)undoButtonClicked
{
    //NSLog(@"%s", __FUNCTION__);
    if ([self.currentArray count] == 0) {
        //nothing to undo
        return;
    }

    DrawingPath *undonePath = [self.currentArray lastObject];
    [self.currentArray removeLastObject];
    [self.redoStack addObject:undonePath];
    [self setNeedsDisplay];

}

-(void)redoButtonClicked
{
    //NSLog(@"%s", __FUNCTION__);

    if ([self.redoStack count] == 0) {
        // nothing to redo
        return;
    }

    DrawingPath *redonePath = [self.redoStack lastObject];
    [self.redoStack removeLastObject];
    [self.currentArray addObject:redonePath];
    [self setNeedsDisplay];

}

これが他の人の役に立つことを願っています。

更新-これは、以下の質問への回答です:「currentColoredPathとは何ですか?」

  1. @property (strong,nonatomic) DrawingPath *currentColoredPath;

  2. これは、私が次のように書いたクラスDrawingPathを参照しています。

.h

#import <Foundation/Foundation.h>

@interface DrawingPath : NSObject {
    NSString *brushSize;
}
@property (strong, nonatomic) NSString *brushSize;
@property (strong,nonatomic) UIColor *color;
@property (strong,nonatomic) UIBezierPath *path;

- (void)draw;
- (void)brushChange;

.m

#import "DrawingPath.h"

@implementation DrawingPath

@synthesize path = _path;
@synthesize color = _color;
@synthesize brushSize = _brushSize;
float brush = 12;

- (id)init {
    //NSLog(@"%s", __FUNCTION__);
    if (!(self = [super init] ))
        return nil;
    brushSize = [[NSUserDefaults standardUserDefaults] objectForKey:@"brushKey"];
    [self brushChange];


    _path = [[UIBezierPath alloc] init];
    _path.lineCapStyle=kCGLineCapRound;
    _path.lineJoinStyle=kCGLineJoinRound;

    [_path setLineWidth:brush];





    return self;
}

- (void)draw {
    //NSLog(@"%s", __FUNCTION__);

    [self.color setStroke];
    [self.path stroke];
}

- (void)brushChange { //from notification
    //NSLog(@"%s", __FUNCTION__);

    brushSize = [[NSUserDefaults standardUserDefaults] objectForKey:@"brushKey"];
    //NSLog(@"DrawingPath - brushSize is %@: ", brushSize );


    //NSLog(@"DrawingPath - brush is %f: ", brush );

}
于 2012-05-17T05:42:07.743 に答える