2013-03-21 13 views
5

Próbuję utworzyć ścieżkę przycinającą w kształcie znaku plus, tak aby kolejne ścieżki, które rysuję w tym samym kontekście, zostały usunięte. Tworzę ścieżkę przycinającą za pomocą dwóch prostokątnych ścieżek nałożonych na siebie nawzajem.iOS - Clipping union dwóch ścieżek przy użyciu UIBezierPath appendPath

To co chciałbym ostateczny rysunek wyglądać kiedy następnie narysować okrąg:

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

Jednak faktycznie wygląda następująco:

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

Jeśli poprawnie odczytam to zachowanie, przecięcie dwóch prostokątnych ścieżek nie stanowi części maski przycinającej.

Wydaje się (co nie dziwi), że appendPath nie tworzy pojedynczą jednolitą ścieżkę z moich dwóch prostokątnych ścieżek w tym przypadku - Jestem przy założeniu, że nie ma nic nie mogę z tym zrobić. Co więcej, Core Graphics nie ma żadnych funkcji związanych ze związkami ścieżek itp.

Czy ktoś ma pojęcie, co mogę zrobić? Dodałem odpowiedni fragment kodu.

Rysowanie znaku plus za pomocą jednej ścieżki nie jest rozwiązaniem, ponieważ chcę dodać inne nakładające się ścieżki do maski przycinającej.

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

Odpowiedz

2

można dodać z powrotem kawałek, który zostaje znokautowany przez skrzyżowanie przy użyciu 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); 

ten spełnia wymogi swoje pytanie, ale czy to całkowicie zaspokaja swoich potrzeb zależy od charakteru z "inne nakładające się ścieżki".

enter image description here

+0

Wielki - CGRectIntersection było to, czego brakowało. Dzięki –