0

PDF リーダー アプリにハイライト機能を実装したいと考えています。残念ながら、私の調査では、これに関する情報はほとんど得られませんでした。ただし、描画または「ハイライト」を行う必要がある場合は「オーバーレイ」を使用する必要があると考えるようになりました。私が今やろうとしているのは、PDFにCALayerを追加することです。レイヤーに形状をレンダリングすることには成功していますが (単純な線、円、正方形など)、レイヤーに自由に描画することはできません (何かを描画する場合のように)。使用したコードは次のとおりです。

ユーザーが強調表示を開始すると:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
    prevPoint = [touch locationInView:theContentView];

    drawImageLayer = [CALayer layer];
    drawImageLayer.frame = theContentView.frame;
    [theContentView.layer addSublayer:drawImageLayer];

}

ユーザーが強調表示を開始するとき:

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

    [drawImageLayer setNeedsDisplay];
}

これは、描画が行われるコードです。

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
NSLog(@"DrawLayer being called..");

CGContextSaveGState(ctx);

CGContextSetLineCap(ctx, kCGLineCapRound);
CGContextSetLineWidth(ctx, 1.0);
CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1);
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, prevPoint.x, prevPoint.y);
CGContextAddLineToPoint(ctx, currPoint.x, currPoint.y);
CGContextStrokePath(ctx);
prevPoint = currPoint;

CGContextRestoreGState(ctx);

}

何が起こるかというと、点が描かれ、その点はどこでもカーソルをたどります! このコードの何が問題なのか誰か教えてもらえますか?

4

1 に答える 1

1

drawLayer:レイヤー全体を再描画します。以前に描画されたものは保持されません。prevPointからに線を引き、currPointを更新しcurrPointます。drawLayer:更新するたびに が呼び出されるためcurrPoint( を呼び出すためsetNeedsDisplay)、prevPointは に非常に近いためcurrPoint、基本的にユーザーの指の後にポイントが表示されます。

ユーザーがタッチダウンした場所から始まり、ユーザーの指が現在ある場所で終わる直線が必要な場合は、おそらく line を取り除きたいと思うでしょう prevPoint = currPoint;。 '指は現在です。

ユーザーの指に沿った滑らかな線が必要な場合は、ポイントのリストを追跡し、すべてのポイントを で接続する必要がありますdrawLayer。実際には、touchesMoved:は 1 ピクセルの移動ごとに呼び出されるわけではないため、すべてのポイントを滑らかに接続する曲線を補間する必要がある場合があります。

于 2012-06-13T04:57:20.920 に答える