我想在我的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);
}
它会产生一个点,并且光点随处可见!谁能告诉我这段代码有什么问题?
答案 0 :(得分:1)
drawLayer:
重新绘制整个图层;它不保留以前绘制的内容。您从prevPoint
到currPoint
画一条线,然后更新currPoint
。由于每当您更新drawLayer:
时都会调用currPoint
(因为您致电setNeedsDisplay
),prevPoint
将非常接近currPoint
,这就是为什么您基本上只是看到用户手指后面的一个点。
如果你想要一条直线从用户着陆开始到用户手指当前所在的位置,你可能只想摆脱这条线
prevPoint = currPoint;
,因此将始终从用户首次触及的位置到用户手指当前所在的位置画一条线。
如果你想要一条跟在用户手指上的平滑线,那么你需要跟踪一个点列表,并在drawLayer
中将它们全部连接在一起。实际上,由于在每次单像素移动后都不会调用touchesMoved:
,因此您可能需要插入一条平滑连接所有点的曲线。