笔画应用于核心图形中的圆角矩形

问题描述:

我有一个使用自定义UITableViewCell背景的圆角渐变。我正在尝试将中风应用到路径上,但无法完成,并且无法看到我出错的地方。笔画应用于核心图形中的圆角矩形

CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ; 
    CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ; 
    minx = minx + 1; 
    miny = miny ; 

    maxx = maxx - 1; 
    maxy = maxy - 1; 

    CGContextMoveToPoint(c, minx, miny); 
    CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin); 
    CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin); 
    CGContextAddLineToPoint(c, maxx, miny); 
    CGContextAddLineToPoint(c, minx, miny); 

    // Fill and stroke the path 
    CGContextClip(c); 
    CGContextStrokePath(c); 

    CGFloat locations[2] = { 0.0, 1.0 }; 
    CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND; 
    CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); 
    CGGradientRef myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2); 
    CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0); 
    CGGradientRelease(myGradient); 
    CGColorSpaceRelease(myColorspace); 

此代码将矩形向右旋转并应用渐变,但不会对该行进行笔触。我的错误在哪里?

alt text http://grab.by/26Ye



编辑: 按SUBW的建议,我改变了代码为:

CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); 
    CGGradientRef myGradient = nil; 
    CGFloat components[8] = TABLE_CELL_BACKGROUND; 
    CGContextSetFillColorWithColor(c, [[UIColor redColor] CGColor]); 
    CGContextSetStrokeColorWithColor(c, [[UAColor redColor] CGColor]); 
    CGContextSetLineWidth(c, 2); 

    CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ; 
    CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ; 
    minx = minx + 1; 
    miny = miny ; 

    maxx = maxx - 1; 
    maxy = maxy - 1; 

    CGContextMoveToPoint(c, minx, miny); 
    CGContextAddArcToPoint(c, minx, maxy, midx, maxy, kDefaultMargin); 
    CGContextAddArcToPoint(c, maxx, maxy, maxx, miny, kDefaultMargin); 
    CGContextAddLineToPoint(c, maxx, miny); 
    CGContextAddLineToPoint(c, minx, miny); 

    // Fill and stroke the path 
    CGContextSaveGState(c); 
    CGContextClip(c); 

    CGFloat locations[2] = { 0.0, 1.0 }; 
    CGFloat mycomponents[8] = TABLE_CELL_BACKGROUND; 
    CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); 
    myGradient = CGGradientCreateWithColorComponents(myColorspace, mycomponents, locations, 2); 
    CGContextDrawLinearGradient(c, myGradient, CGPointMake(minx,miny), CGPointMake(minx,maxy), 0); 

    CGContextRestoreGState(c); 
    CGContextStrokePath(c); 

但RECT出来是这样的...

alt text http://grab.by/2714

...没有边框。如果我将CGContextStrokePath(c)更改为CGContextStrokeRect(c, rect),笔画显示出来(我为了澄清而使其红色)。但不知何故,抚摸路径的时候,我没有得到任何行程:(

alt text http://grab.by/27aM

应对修改后的代码,我引用文档:

不同于当前路径,当前剪切路径是图形状态的一部分。因此,要通过将剪贴路径恢复到之前的状态来重新放大可绘制区域,必须在剪切并在完成任何剪切的绘图之后还原图形状态之前保存图形状态。

确定新的剪切路径后,该函数将上下文的当前路径重置为空路径。

- CGContextClip

所以,当前的绘图路径是图形状态的一部分。因此,这里是你在做什么:

  1. 生成描绘轨迹
  2. 保存gstate
  3. 添加当前绘制路径,剪辑路径; 清楚当前绘图路径
  4. 画出梯度
  5. 还原gstate(以前剪切路径被恢复;绘制路径保持为空)
  6. 中风没什么

的解决方案是绘制的路径成CGPath对象,然后在裁剪之前(保存gstate之后)和抚摸之前将其作为当前路径添加。

您还应该决定是否要将其设置为外部笔划,内部笔划或中心笔划。对于中心的中风,中风而不夹住。对于内部中风,夹住时发生中风。对于外部行程,反转路径,然后剪切,然后行程。因为您将裁剪出一半的笔画,所以您会希望将最后两种形式的线宽加倍。

如果我将CGContextStrokePath(c)更改为CGContextStrokeRect(c, rect),笔画显示出来。

因为该功能在抚摸之前将该矩形的路径添加到当前绘图路径。

+0

为什么在设置剪切路径时清除当前路径? CGContextClip的文档没有提到这一点。 – mrueg 2010-02-01 20:24:32

+0

subw:是的。 “在确定新的剪切路径后,函数将上下文的当前路径重置为空路径。”它这样做是因为PostScript(PDF的直接祖先)是这样做的。 – 2010-02-01 21:51:21

+0

有道理。今晚我会尝试这个 – coneybeare 2010-02-01 22:48:39

不知道,但也许你画过中风的梯度?

+0

我不这么认为。我在更新代码中的渐变之后绘制描边。 – coneybeare 2010-02-01 15:14:56

你要么绘制梯度在行程,和/或裁剪的区域进行描边

我认为以下可能会更好地工作:

CGContextSaveGState(c); 
CGContextClip(c); 

//gradient drawing stuff 

CGContextRestoreGState(c); 
CGContextStrokePath(c); 

当然,您还必须正确设置笔触颜色和宽度。

+0

我认为这样做,但它没有:http://grab.by/2714 – coneybeare 2010-02-01 14:55:37

+0

还有一个问题:你有一个电话到CGContextBeginPath(c)的地方?如果不是,那可能是一个问题。 – mrueg 2010-02-01 17:55:02

+0

我不知道。我更新了代码,以显示在绘制单元的代码的这部分之前所拥有的内容。 – coneybeare 2010-02-01 18:16:07