8

I am making an image editor which can create different shapes objects like circle, triangle and square which can also be updated or removed. So I have used CAShapeLayer for creating shapes objects.

Now I also want to draw a line on image which can also be updated or removed so I have used bezierpath and CAShapeLayer to create the line, it is working fine. BUT now the problem is that when I want to select any existing line it can be selected any where close to line tool because CAShapeLayer also set the fill region which will be a straight line from start point to end point.

My question is that how can I create line with no fill region using CAShapeLayer.

Here is my code for creating line:

CAShapeLayer *line = [CAShapeLayer layer];
// Using bezierpath to make line 
UIBezierPath *linePath=[UIBezierPath bezierPath];

// Creating L with line

[linePath moveToPoint:point1];
[linePath addToPoint:point2];
[linePath addToPoint:point3];
line.path=linePath.CGPath;


// Configure the appearence of the line
line.fillColor = Nil;
line.opacity = 1.0;
line.strokeColor = [UIColor whiteColor].CGColor;

Any idea on this will be really appreciated.

Unheilig
  • 16,196
  • 193
  • 68
  • 98
Usman Awan
  • 1,208
  • 2
  • 13
  • 30

2 Answers2

5

Can you try this. Its work for me

    CAShapeLayer *line = [CAShapeLayer layer];
    UIBezierPath *linePath=[UIBezierPath bezierPath];
    [linePath moveToPoint:CGPointMake(startx, starty)];
    [linePath addLineToPoint:CGPointMake(endx, endy)];
    line.lineWidth = 10.0;
    line.path=linePath.CGPath;
    line.fillColor = shapecolor.CGColor;
    line.strokeColor = shapecolor.CGColor;
    [[self.view layer] addSublayer:line];
btmanikandan
  • 1,923
  • 2
  • 25
  • 45
  • will definitely check it and let you know. – Usman Awan Dec 04 '14 at 11:59
  • are you not missing [linePath stroke]? – Max MacLeod Dec 15 '14 at 10:21
  • You don't need `[linePath stroke]` here, and in fact, you'll probably get context errors if you do (unless you manually start a context or use this in `drawRect`) - calling `stroke` uses Core Graphics, but right here we want to use Core Animation. – Dominic K Apr 25 '16 at 21:59
0

I understand you I experienced this issue as well try this:

GPathRef linePathRef = linePath.CGPath
linePathRef = CGPathCreateCopyByStrokingPath(linePathRef, NULL, line.lineWidth, kCGLineCapRound, kCGLineJoinRound, 1);
BOOL pathContainsPoint = CGPathContainsPoint(linePathRef, NULL, touchLocation, NO);

if(pathContainsPoint){
    //Do something with the cashapelayer line...
}else{
    //Do something here if needed... 
}
jane
  • 309
  • 2
  • 11