2

iPad (4) のユーザーの手書き (カーソル位置) を描画するビューを実装しようとしています。OpenGLを使ったAppleのサンプルコードを見たのですが、理解できない部分があったので、コアグラフィックスを使って実装してみました。

    #import "PaintView.h"
    #include <stdlib.h>

    @implementation PaintView


    - (id)initWithCoder:(NSCoder *)aDecoder {
        self = [super initWithCoder:aDecoder];
        if(self) {
            //
            pointsToDraw = [[NSMutableArray alloc] init];
        }
        return self;
    }


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

        CGPoint location = [touch locationInView:self];
        CGPoint previousLocation = [touch previousLocationInView:self];

        Ink *ink = [[Ink alloc] initWithPoint:previousLocation toPoint:location time:touch.timestamp];

    //    UITouch *newTouch = [touch copy];
        [pointsToDraw addObject:ink];


        [self setNeedsDisplay];
    }

    - (void)drawLine:(CGPoint)startingPoint toPoint:(CGPoint)endingPoint context:(CGContextRef)context
    {
        // Drawing code
        CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);

        CGRect temp = CGRectMake(10, 10, 100, 100);
        // Draw them with a 2.0 stroke width so they are a bit more visible.
        CGContextSetLineWidth(context, 2.0);

        CGContextMoveToPoint(context, startingPoint.x,startingPoint.y); //start at this point

        CGContextAddLineToPoint(context, endingPoint.x, endingPoint.y); //draw to this point

        // and now draw the Path!

    }


    - (void)drawRect:(CGRect)rect
    {
        [super drawRect:rect];

       // [self drawLine:CGPointMake(10, 10) toPoint:CGPointMake(30, 30)];

        CGContextRef context = UIGraphicsGetCurrentContext();

        for (Ink *ink in pointsToDraw){

            [self drawLine:ink.point toPoint:ink.previousPoint context:context];
        }
        CGContextStrokePath(context);

    }


    @end

問題は、タッチするたびにすべてを描画し (インクは 2 つの CGPOINT とタイム スタンプを含むクラスです)、しばらくすると劇的に遅くなり、かなりの遅延が発生することです。

私の目標は、手書きを正確にキャプチャし、正確に再生できるようにすることです。

考慮すべきもう1つのことは、圧力情報を提供するスタイラスを使用しているため、幅を変えて線を引くことができる必要があるということです.

どんなアドバイスでも大歓迎です。

4

1 に答える 1

1

ポイントを配列に格納する代わりに、配列と UIBezierPath に格納します。次に、スキーム全体を設定する代わりに、drawRect: 内でベジエ パスを描画するだけで済みます。

スタイラスは圧力情報を提供しません - 少なくとも iOS ではそうではありません。iPhone には、抵抗膜方式ではない静電容量方式のタッチ スクリーンがあります。幅を変更する標準的なアルゴリズムは、速度を係数として使用し、塗りつぶして線を作成する小さな三角形を使用して描画することです。

面白い!関連する記事は次のとおりです。 http://www.nearinfinity.com/blogs/jason_harwig/2012/11/06/capture-a-signature-on-ios.html

于 2013-01-16T20:09:39.367 に答える