2

指を使って描画できるキャンバスのように機能する UIView を作成しようとしています。CanvasView を実装します。指が動くと、まず既存の画像を描画し、次に前のポイントと現在のポイントを結ぶ小さな線を描画します。指を動かすと画像が描画されますが、描画中に画像が消えていきます。そして、なぜこのような状況が発生するのかわかりません。UIView を使用してキャンバスを実現する方法が他にもいくつかあることは知っていますが、実装が間違っている理由を知りたいです。以下は私の完全なコードです。そして、誰かがこのコードをコピーして実行してくれることを願っています。そうすれば、私の問題がより直感的になる可能性があります。

#import <UIKit/UIKit.h>

@interface CanvasView : UIView

@end

#import "CanvasView.h"
#import <QuartzCore/QuartzCore.h>

@interface CanvasView()
@property (nonatomic) CGPoint startPoint;
@property (nonatomic) CGPoint endPoint;
@property (nonatomic, strong) UIImage* oldImage;
@end

@implementation CanvasView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.backgroundColor = [UIColor whiteColor];
    }
    return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch* touch = [touches anyObject];
    self.startPoint = [touch locationInView:self];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch* touch = [touches anyObject];
    self.endPoint = [touch locationInView:self];

    UIGraphicsBeginImageContext(self.bounds.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    self.oldImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self setNeedsDisplay];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch* touch = [touches anyObject];
    self.endPoint = [touch locationInView:self];

    UIGraphicsBeginImageContext(self.bounds.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    self.oldImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self setNeedsDisplay];
}

-(void)drawRect:(CGRect)rect{
    CGContextRef context = UIGraphicsGetCurrentContext();

    //draw image already exists
    [self.oldImage drawInRect:self.bounds];

    //draw new tiny line
    CGContextBeginPath(context);
    CGContextMoveToPoint(context, self.startPoint.x, self.startPoint.y);
    CGContextAddLineToPoint(context, self.endPoint.x, self.endPoint.y);
    CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);
    CGContextSetLineWidth(context, 5.);
    CGContextStrokePath(context);

    self.startPoint = self.endPoint;
}

@end
4

0 に答える 0