Objective c 突出显示PDF-iOS
我想在我的pdf阅读器应用程序中实现一个突出显示功能。不幸的是,我的研究几乎没有关于这方面的信息。然而,我开始相信,我将不得不使用一个“覆盖”在绘图或“突出显示”必须完成。我现在计划做的是在pdf中添加一个CALayer。我成功地将形状渲染到层中(例如简单的线、圆和正方形),但我似乎无法自由地绘制到层中(如绘制某物)。以下是我使用的代码: 当用户开始高亮显示时:Objective c 突出显示PDF-iOS,objective-c,ios,xcode,calayer,quartz-graphics,Objective C,Ios,Xcode,Calayer,Quartz Graphics,我想在我的pdf阅读器应用程序中实现一个突出显示功能。不幸的是,我的研究几乎没有关于这方面的信息。然而,我开始相信,我将不得不使用一个“覆盖”在绘图或“突出显示”必须完成。我现在计划做的是在pdf中添加一个CALayer。我成功地将形状渲染到层中(例如简单的线、圆和正方形),但我似乎无法自由地绘制到层中(如绘制某物)。以下是我使用的代码: 当用户开始高亮显示时: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
- (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)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);
}
所发生的是,它绘制了一个点,并且该点在任何地方都跟随光标!谁能告诉我这个代码有什么问题吗?
drawLayer:
重画整个图层;它不保留以前绘制的内容。从prevPoint
到currPoint
画一条线,然后更新currPoint
。由于drawLayer:
将在您更新currPoint
时被调用(因为您调用setNeedsDisplay
),因此prevPoint
将非常接近currPoint
,这就是为什么您基本上只看到用户手指后面的一点
如果您想要一条直线,从用户触地的位置开始,到用户手指当前所在的位置结束,那么您可能只想去掉这条直线
prevPoint=currPoint代码>,它将始终从用户第一次触地的位置到用户手指当前所在的位置绘制一条线
如果您想要一条沿着用户手指的平滑线条,那么您需要跟踪点列表,并在drawLayer
中将所有点连接在一起。实际上,由于每次像素移动后都不会调用touchesMoved:
,因此您可能需要插入一条平滑连接所有点的曲线。感谢您的澄清!如果我有任何进展,我会告诉你:)