2013-03-21 3 views
5

Я пытаюсь создать обтравочный контур в форме знака плюса, так что последующие пути, которые я рисую в одном контексте, удалены этой частью. Я создаю обтравочный контур, используя два пути прямоугольника, наложенные друг на друга.iOS - Объединение двух путей с помощью UIBezierPath appendPath

Это то, что я хотел бы окончательный рисунок, чтобы выглядеть, когда я впоследствии нарисовать круг:

            ххх |       XXX
      XXXX |       | XXXX
  XXXXX |       | XXXXX
  ---             ---
  ---             ---
  XXXXX |       | XXXXX
      XXXX |       | XXXX
            ххх |       | икс

Однако, на самом деле выглядит следующим образом:

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

Если я правильно прочитал это поведение, пересечение двух путей прямоугольника не является частью обтравочной маски.

Кажется (что неудивительно), что appendPath не создает единый путь из моих двух путей прямоугольника в этом случае - я предполагаю, что я ничего не могу с этим поделать. Кроме того, у Core Graphics нет никаких функций, относящихся к объединениям каналов и т. Д.

Кто-нибудь может понять, что я могу сделать? Я включил соответствующий фрагмент кода.

Рисование знака плюс одним путем не является решением, так как я хочу добавить другие перекрывающиеся пути к моей обтравочной маске.

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

ответ

2

Вы можете добавить обратно кусок, который получает нокаутировал пересечением с помощью 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); 

Это удовлетворяет требованиям вашего вопроса, но полностью ли она удовлетворяет ваши потребности, зависит от природы используемого «другие перекрывающиеся пути».

enter image description here

+0

Великий - CGRectIntersection было то, что мне не хватало. благодаря –