2013-10-02 12 views
8

Tworzę edytor obrazów, który może tworzyć różne kształty obiektów, takich jak koło, trójkąt i kwadrat, które również można zaktualizować lub usunąć. Tak więc użyłem CAShapeLayer do tworzenia obiektów kształtów.Rysowanie linii z Bezierpath przy użyciu obiektu CAShapeLayer

Teraz również chcę narysować linię na obrazie, który również można zaktualizować lub usunąć, więc użyłem bezierpath i CAShapeLayer do utworzenia linii, działa dobrze. ALE teraz problem polega na tym, że gdy chcę wybrać dowolną istniejącą linię, można wybrać dowolne narzędzie blisko linii, ponieważ CAShapeLayer ustawia również obszar wypełnienia, który będzie linią prostą od punktu początkowego do punktu końcowego.

Moje pytanie brzmi: w jaki sposób utworzyć linię bez obszaru wypełnienia przy użyciu CAShapeLayer.

Oto mój kod do tworzenia linii:

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; 

Każdy pomysł na to będzie bardzo mile widziane.

+0

to działa. Prawdopodobnie zapomniałeś dodać warstwę '' '[self.view.layer addSublayer: line];' '' – Shmidt

+0

Dodałem również tę linię, tworzy ona cienką linię, ale także wypełnia region od punktu początkowego do punktu końcowego i rozważa to jako część warstwowa. Problem polega na tym, że gdy tylko spróbuję dotknąć w pobliżu linii liniowej, wybierz opcję. –

+0

Czy używasz '[linePath addLineToPoint: point2]'? –

Odpowiedz

3

Możesz spróbować tego. Jego praca dla mnie

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]; 
+0

na pewno to sprawdzę i dam ci znać. –

+0

czy nie brakuje Ci [skoku LinePath]? –

+0

Nie musisz "[linePath stroke]" tutaj, i faktycznie, prawdopodobnie dostaniesz błędy kontekstu, jeśli to zrobisz (chyba że ręcznie uruchomisz kontekst lub użyjesz go w 'drawRect') - wywołanie' stroke' używa Core Grafika, ale właśnie tutaj chcemy użyć Core Animation. – DMan

0

Rozumiem, że doświadczyłem tego problemu, jak również spróbować tego:

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... 
} 
Powiązane problemy