如何从两个重叠形状之间的DIFFERENCE边界找到CGPath

时间:2014-01-31 09:07:23

标签: ios objective-c core-text cgpath

很长一段时间我都在问这个问题。请随时建议任何编辑或说明

我想写一个带有两个rects(Primary和secondary)的方法,如果它们相交,它会给我一个CGPath,它位于(Primary MINUS Secondary)的边界上

像这样的psudo代码: (假设rectTWO将始终为nonEMPTY,rectONE和wurectONE)

-(CGPathRef)clippedPathfromRect:(CGRect)rectONE clippingRect:(CGRect)rectTWO{        
      1. find ->  rectFinal = rectONE MINUS rectTWO
      2. create a path along the boundary of rectFinal (say finalPATH)
      3. return rectFinal
}

enter image description here

Q2:如何在此形状渲染之前或之后计算此文本的高度?

1 个答案:

答案 0 :(得分:0)

查看此回答https://stackoverflow.com/a/15228510/1717391。 您可以将rects添加到CGMutablePathRef,而不是将它们添加到NSMutableArray。

// helper function, returns the area between rect1 and rect2 along the edge
static CGRect rectBetween(CGRect rect1, CGRect rect2, CGRect* remainder, CGRectEdge edge)
{
    CGRect intersectedRect = CGRectIntersection(rect1, rect2);
    if (CGRectIsEmpty(intersectedRect)) {
        return CGRectNull;
    }

    CGRect rect3;
    float chopAmount = 0;
    switch (edge) {
        case CGRectMaxYEdge:
            chopAmount = rect1.size.height - (intersectedRect.origin.y - rect1.origin.y);
            if (chopAmount > rect1.size.height) { chopAmount = rect1.size.height; }
            break;
        case CGRectMinYEdge:
            chopAmount = rect1.size.height - (CGRectGetMaxY(rect1) - CGRectGetMaxY(intersectedRect));
            if (chopAmount > rect1.size.height) { chopAmount = rect1.size.height; }
            break;
        case CGRectMaxXEdge:
            chopAmount = rect1.size.width - (intersectedRect.origin.x - rect1.origin.x);
            if (chopAmount > rect1.size.width) { chopAmount = rect1.size.width; }
            break;
        case CGRectMinXEdge:
            chopAmount = rect1.size.width - (CGRectGetMaxX(rect1) - CGRectGetMaxX(intersectedRect));
            if (chopAmount > rect1.size.width) { chopAmount = rect1.size.width; }
            break;
        default:
            break;
    }
    CGRectDivide(rect1, remainder, &rect3, chopAmount, edge);

    return rect3;
}

/**
 * create a path by substracting rect2 from rect1.
 * return NULL if rect1 is empty.
 * Caller have to released the resulting path
 */
-(CGPathRef)createPathFromRect:(CGRect)rect1 clippingRect:(CGRect)rect2
{
     if (CGRectIsEmpty(rect1)) {
        return NULL;
    }
    CGMutablePathRef path = CGPathCreateMutable();

    CGRect intersectedRect = CGRectIntersection(rect1, rect2);

    // No intersection
    if (CGRectIsEmpty(intersectedRect)) {
        CGPathAddRect(path, NULL, rect1);
        return path;
    }

    CGRect remainder;
    CGRect subtractedArea;
    subtractedArea = rectBetween(rect1, intersectedRect, &remainder, CGRectMaxYEdge);

    if (!CGRectIsEmpty(subtractedArea)) {
        CGPathAddRect(path, NULL, subtractedArea);
    }

    subtractedArea = rectBetween(remainder, intersectedRect, &remainder, CGRectMinYEdge);
    if (!CGRectIsEmpty(subtractedArea)) {
        CGPathAddRect(path, NULL, subtractedArea);
    }

    subtractedArea = rectBetween(remainder, intersectedRect, &remainder, CGRectMaxXEdge);
    if (!CGRectIsEmpty(subtractedArea)) {
        CGPathAddRect(path, NULL, subtractedArea);
    }

    subtractedArea = rectBetween(remainder, intersectedRect, &remainder, CGRectMinXEdge);
    if (!CGRectIsEmpty(subtractedArea)) {
        CGPathAddRect(path, NULL, subtractedArea);
    }
    return path;
}

- (void)drawRect:(CGRect)rect
{
    CGPathRef path = [self createPathFromRect:CGRectMake(10, 10, 200, 200) clippingRect:CGRectMake(210-40, 10, 40, 40)];
    if (path)
    {
        CGContextRef ctx = UIGraphicsGetCurrentContext();

        CGContextAddPath(ctx, path);
        CGContextFillPath(ctx);
        CFRelease(path);
    }
}
相关问题