2013-07-09 6 views
12

Ich mache eine komplexe Form mit ein paar CGRects und Ellipsen. Ich möchte diesen Pfad einmal streichen, sobald er erstellt wurde. Wenn ich den Pfad streiche, streicht er jede Form. Gibt es eine Möglichkeit, jede Form zu einem einzigen Pfad zusammenzufassen, so dass sich der Strich nicht schneidet?Zusammenführen mehrerer CGPaths zu einem Pfad

enter image description here

int thirds = self.height/3; 

CGPathRef aPath = CGPathCreateMutable(); 

CGRect rectangle = CGRectMake((58 - 10)/2, 46, 10, self.height - 58); 
CGPathAddRect(aPath, nil, rectangle); 

CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, 0, 48, 48)); 
CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, thirds, 48, 48)); 
CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, thirds * 2, 48, 48)); 
CGPathAddEllipseInRect(aPath, nil, CGRectMake(0, self.height - 58, 58, 58)); 
CGPathCloseSubpath(aPath); 
CGPathRef other = CGPathCreateCopy(aPath); 

CAShapeLayer *square = [CAShapeLayer layer]; 
square.fillColor = [UIColor colorWithRed:36/255.0f green:56/255.0f blue:82/255.0f alpha:1.0f].CGColor; 
square.strokeColor = [UIColor colorWithRed:50/255.0f green:70/255.0f blue:96/255.0f alpha:1.0f].CGColor; 
square.path = other; 
[self.layer addSublayer:square]; 

UPDATE

Ich habe versucht, mit Pfaden Addition und ich habe genau das gleiche Ergebnis

CGPathAddPath(aPath, nil, CGPathCreateWithRect(rectangle, nil)); 

CGPathAddPath(aPath, nil, CGPathCreateWithEllipseInRect(CGRectMake((58 - 48)/2, 0, 48, 48), nil)); 
CGPathAddPath(aPath, nil, CGPathCreateWithEllipseInRect(CGRectMake((58 - 48)/2, thirds, 48, 48), nil)); 
CGPathAddPath(aPath, nil, CGPathCreateWithEllipseInRect(CGRectMake((58 - 48)/2, thirds * 2, 48, 48), nil)); 
CGPathAddPath(aPath, nil, CGPathCreateWithEllipseInRect(CGRectMake(0, self.height - 58, 58, 58), nil)); 
+0

'CGPathAddPath (path1, NULL, path2)' – CodaFi

+0

@CodaFi Also einen neuen Pfad für jede Form erstellen und 'CGPathAddPath' verwenden? – brenjt

Antwort

20

Wenn Sie einen Pfad möchten, dass die Kontur beschreibt nur von Wenn Sie Ihre Pfadkomposition erstellen, müssen Sie boolesche Operationen für die beteiligten Shapes ausführen.
Es gibt einige gute Tutorials da draußen.
ZB: http://losingfight.com/blog/2011/07/07/how-to-implement-boolean-operations-on-bezier-paths-part-1/

Wenn Sie nur das visuelle Erscheinungsbild eines Umrisses erzielen möchten, können Sie zwei Formebenen zeichnen:

  • eines, das einen Pfad über CGPathCreateCopyByStrokingPath und
  • erhielt man füllt, dass füllt den ursprünglichen Pfad oben auf

die Formen aus dem Code Verwenden Sie auf dem Laufenden:

int thirds = self.height/3; 

CGMutablePathRef aPath = CGPathCreateMutable(); 

CGRect rectangle = CGRectMake((58 - 10)/2, 46, 10, self.height - 58); 
CGPathAddRect(aPath, nil, rectangle); 

CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, 0, 48, 48)); 
CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, thirds, 48, 48)); 
CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, thirds * 2, 48, 48)); 
CGPathAddEllipseInRect(aPath, nil, CGRectMake(0, self.height - 58, 58, 58)); 
CGPathCloseSubpath(aPath); 

CGPathRef other = CGPathCreateCopyByStrokingPath(aPath, NULL, 12.0, kCGLineCapRound, kCGLineJoinRound, 1.0); 
CAShapeLayer *square = [CAShapeLayer layer]; 
square.fillColor = [UIColor colorWithRed:36/255.0f green:56/255.0f blue:82/255.0f alpha:1.0f].CGColor; 
square.path = other; 
[self.view.layer addSublayer:square]; 

CAShapeLayer *square2 = [CAShapeLayer layer]; 
square2.fillColor = [UIColor colorWithRed:50/255.0f green:70/255.0f blue:96/255.0f alpha:1.0f].CGColor; 
square2.path = aPath; 
[self.view.layer addSublayer:square2]; 

, dass die folgende Form wird ziehen:
enter image description here

+0

Sie sind ein Genie und ein Gelehrter. Danke für die Erklärung. – brenjt

+0

Gern geschehen! –

1

Basierend auf der Antwort von Thomas Zoechling

Für swift3

height = self.bounds.size.height 
let thirds = self.height/3 

let aPath: CGMutablePath = CGMutablePath() 
let rect = CGRect(x: (58 - 10)/2, y: 46, width: 10, height: self.height - 58) 
aPath.addRect(rect) 

aPath.addEllipse(in: CGRect(x: (58 - 48)/2, y: 0, width: 48, height: 48)) 
aPath.addEllipse(in: CGRect(x: (58 - 48)/2, y: thirds, width: 48, height: 48)) 
aPath.addEllipse(in: CGRect(x: (58 - 48)/2, y: thirds * 2, width: 48, height: 48)) 
aPath.addEllipse(in: CGRect(x: 0, y: self.height, width: 48, height: 48)) 
aPath.closeSubpath() 

let other: CGPath = aPath.copy(strokingWithWidth: 12, lineCap: .round, lineJoin: .round, miterLimit: 1.0) 
let square = CAShapeLayer() 
square.fillColor = UIColor(red: 36/255.0, green: 56/255.0, blue: 82/255.0, alpha: 1.0).cgColor 
square.path = other 
self.layer.addSublayer(square) 

let square2 = CAShapeLayer() 
square2.fillColor = UIColor(red: 50/255.0, green: 70/255.0, blue: 96/255.0, alpha: 1.0).cgColor 
square2.path = aPath 
self.layer.addSublayer(square2)