2013-07-09 12 views
12

Sto creando una forma complessa utilizzando alcuni CGRects ed Ellips. Mi piacerebbe accarezzare quel percorso una volta che è stato creato. Quando accarezzo il percorso, tocca ogni forma. C'è un modo per unire ogni forma in un unico percorso, quindi il tratto non si interseca?Unisci più CGPath insieme per creare un percorso

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

Ho provato con l'aggiunta di percorsi insieme ed ho ottenuto esattamente lo stesso risultato

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 Quindi creare un nuovo percorso per ogni forma e usare 'CGPathAddPath'? – brenjt

risposta

20

Se si desidera un percorso che descrive solo il contorno di la composizione del tuo percorso, avresti bisogno di eseguire operazioni booleane sulle forme partecipanti.
Ci sono alcuni buoni tutorial là fuori.
Ad esempio: http://losingfight.com/blog/2011/07/07/how-to-implement-boolean-operations-on-bezier-paths-part-1/

Se si desidera solo per ottenere l'aspetto visivo di un contorno, è possibile disegnare 2 livelli forma:

  • uno che riempie un percorso ottenuta tramite CGPathCreateCopyByStrokingPath e
  • uno che riempie il tuo percorso originale in cima

Utilizzando le forme dal codice che avete inviato:

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

che attirerà la seguente forma:
enter image description here

+0

signore, sei un genio e uno studioso. Grazie per la spiegazione. – brenjt

+0

Siete i benvenuti! –

1

Sulla base della risposta di Thomas Zoechling

Per 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) 
Problemi correlati