2013-03-21 10 views
5

Sto tentando di creare un tracciato di ritaglio sotto forma di segno più, in modo che i percorsi successivi che disegno nello stesso contesto abbiano questa parte rimossa. Creo il tracciato di ritaglio usando due percorsi rettangolari sovrapposti l'uno sull'altro.iOS: unione di due percorsi tramite UIBezierPath appendPath

Questo è quello che mi piacerebbe il disegno finale a guardare come quando ho successivamente disegnare un cerchio:

            XXX |       | XXx
      XXXX |       | XXXX
  XXXXX |       | XXXXX
  ---             ---
  ---             ---
  XXXXX |       | XXXXX
      XXXX |       | XXXX
            XXX |       | XXx

Tuttavia, oggi si presenta in questo modo:

            XXX |       | XXx
      XXXX |       | XXXX
  XXXXX |       | XXXXX
  --- ---   XX
  --- ---   XX
  XXXXX |       | XXXXX
      XXXX |       | XXXX
            XXX |       | XXx

Se leggo correttamente questo comportamento, l'intersezione dei due percorsi rettangolari non fa parte della maschera di ritaglio.

Sembra (non sorprendentemente) che appendPath non crei un singolo percorso unificato dai miei due percorsi rettangolari in questo caso - presumo che non ci sia nulla che io possa fare al riguardo. Inoltre, Core Graphics non sembra avere alcuna funzione relativa alle unioni dei percorsi, ecc.

Qualcuno ha qualche idea su cosa posso fare? Ho incluso lo snippet di codice pertinente.

Disegnare il segno più utilizzando un percorso non è una soluzione, poiché desidero aggiungere altri percorsi sovrapposti alla mia maschera di ritaglio.

 CGContextSaveGState(context); 

     // create clipping path 
     UIBezierPath *clippingPath = [UIBezierPath bezierPath]; 
     clippingPath = [UIBezierPath bezierPathWithRect:CGRectMake(centrePoint.x - 2.0f, 0.0f, 4.0f, self.sizeY)]; 
     [clippingPath appendPath:[UIBezierPath bezierPathWithRect:CGRectMake(0.0f, centrePoint.y - 2.0f, self.sizeX, 4.0f)]]; 

     // use the clipping path to create a hole in the context 
     CGContextAddPath(context, clippingPath.CGPath); 
     CGRect boundingRect = CGContextGetClipBoundingBox(context); 
     CGContextAddRect(context, boundingRect); 
     CGContextEOClip(context); 

     // draw the icon shape (clipped portion is removed) 
     iconBezierPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(self.sizeX/3.0f, self.sizeY/2.25f, self.sizeX/3.0f, self.sizeX/3.0f)]; 

     [highlightColor setFill]; 
     [iconBezierPath fill]; 
     CGContextRestoreGState(context); 

risposta

2

È possibile aggiungere di nuovo il pezzo che viene eliminato dalla intersezione utilizzando CGRectIntersection

CGContextSaveGState(context); 

    CGRect rect1 = CGRectMake(centrePoint.x - 2.0f, 0.0f, 4.0f, self.sizeY); 
    CGRect rect2 = CGRectMake(0.0f, centrePoint.y - 2.0f, self.sizeX, 4.0f); 
    CGRect rect3 = CGRectIntersection(rect1, rect2); 

    CGContextAddRect(context, rect1); 
    CGContextAddRect(context, rect2); 
    CGContextAddRect(context, rect3); 

    CGRect boundingRect = CGContextGetClipBoundingBox(context); 
    CGContextAddRect(context, boundingRect); 
    CGContextEOClip(context); 

     // draw the icon shape (clipped portion is removed) 
    iconBezierPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(self.sizeX/3.0f, self.sizeY/2.25f, self.sizeX/3.0f, self.sizeX/3.0f)]; 

    [highlightColor setFill]; 
    [iconBezierPath fill]; 

    CGContextRestoreGState(context); 

Questo soddisfa i requisiti della tua domanda, ma se esso soddisfi interamente le vostre esigenze dipende dalla natura del "altri percorsi sovrapposti".

enter image description here

+0

Grande - CGRectIntersection era quello che mi mancava. Grazie –