0

我想在我的 pdf 阅读器应用程序中实现一个 Highlight 功能。不幸的是,我的研究得到的关于这方面的信息很少。然而,我开始相信我必须使用“覆盖”来绘制或“突出显示”。我现在打算做的是在 pdf 中添加一个 CALayer。我成功地将形状渲染到图层中(例如简单的线条、圆形和正方形),但我似乎无法自由地在其中绘制(就像在 Draw Something 中一样)。这是我使用的代码:

当用户开始突出显示时:

- (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:重绘整个图层;它不保留以前绘制的内容。您从prevPointtocurrPoint然后画一条线 update currPoint。由于drawLayer:将在您更新时currPoint调用(因为您调用setNeedsDisplay),prevPoint将非常接近currPoint,这就是为什么您基本上只看到用户手指后面的一个点。

如果您想要一条从用户触摸的位置开始到用户手指当前所在位置结束的直线,您可能只想摆脱 line prevPoint = currPoint;,这样总是会从用户第一次触摸的位置到用户的位置画一条线' 手指目前是。

如果您想要一条跟随用户手指的平滑线,那么您需要跟踪点列表,并将所有点连接在一起drawLayer。在实践中,由于touchesMoved:不是在每个单像素移动后调用,您可能必须插入一条平滑连接所有点的曲线。

于 2012-06-13T04:57:20.920 回答