2013-03-21 2 views
5

Ich versuche, einen Beschneidungspfad in Form eines Pluszeichens zu erstellen, damit nachfolgende Abschnitte, die ich in den gleichen Kontext zeichne, diesen Teil entfernt haben. Ich erstelle den Beschneidungspfad mit zwei überlagerten Rechteckpfaden.iOS - Clipping Union von zwei Pfaden mit UIBezierPath appendPath

Dies ist, was ich die letzte Zeichnung aussehen möchte, wenn ich einen Kreis anschließend ziehen:

            xXX |       | XXx
      XXXX |       | XXXX
  XXXXX |       | XXXXX
  ---             ---
  ---             ---
  XXXXX |       |
      XXXX |       | XXXX
            xXX |       | XXx

aber es sieht tatsächlich wie folgt aus:

            xXX |       | XXx
      XXXX |       | XXXX
  XXXXX |       | XXXXX
  ---   XX ---
  ---   XX ---
  XXXXX |       |
      XXXX |       | XXXX
            xXX |       | XXx

Wenn ich dieses Verhalten richtig lese, ist der Schnittpunkt der beiden Rechteckpfade nicht Teil der Schnittmaske.

Es scheint (nicht überraschend), dass appendPath in diesem Fall keinen einzigen vereinheitlichten Pfad von meinen zwei Rechteckpfaden erzeugt - ich nehme an, dass ich nichts dagegen tun kann. Außerdem scheint Core Graphics keine Funktionen in Bezug auf Pfadverbindungen usw. zu haben.

Hat jemand eine Idee, was ich tun kann? Ich habe das entsprechende Code-Snippet eingefügt.

Das Pluszeichen unter Verwendung eines Pfades zu zeichnen ist keine Lösung, da ich meiner Schnittmaske andere überlappende Pfade hinzufügen möchte.

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

Antwort

2

Sie können das Stück wieder hinzufügen, die von der Kreuzung mit ausgeknockt wird 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); 

Damit werden die Anforderungen Ihrer Frage genügt, sondern darum, ob es Ihren Bedürfnissen völlig abhängig von der Art des erfüllt "andere überlappende Pfade".

enter image description here

+0

Große - CGRectIntersection war, was ich fehlte. Vielen Dank –

Verwandte Themen