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

con*_*are 1 iphone core-graphics uitableview drawrect stroke

我有一个具有圆角的渐变,我用于自定义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);
Run Code Online (Sandbox Code Playgroud)

此代码向右舍入矩形并应用渐变,但不会对行进行描边.我的错误在哪里?

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);
Run Code Online (Sandbox Code Playgroud)

但是这样的矩阵就像这样......

alt text http://grab.by/2714

......没有边界.如果我改变CGContextStrokePath(c)CGContextStrokeRect(c, rect),则显示笔划(我将其设为红色以便澄清).但不知何故,当抚摸路径时,我没有得到任何中风:(

替代文字http://grab.by/27aM

Pet*_*sey 5

在回复您修改后的代码时,我引用了文档:

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

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

- CGContextClip

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

  1. 建立绘图路径
  2. 保存gstate
  3. 将当前绘图路径添加到剪切路径; 清除当前的绘图路径
  4. 绘制渐变
  5. 恢复gstate(恢复上一个剪切路径;绘图路径保持为空)
  6. 什么都没有

解决方案是将路径绘制到CGPath对象中,然后在剪切之前(保存gstate之后)和行程之前将其添加为当前路径.

您还应该决定是将其设置为外部笔划,内部笔划还是中心笔划.对于中心笔划,笔划未剪裁.对于内部笔划,剪裁时的笔划.对于外部笔划,反转路径,然后剪切,然后中风.你需要将最后两种形式的线宽加倍,因为你将剪掉一半的笔画.

如果我改变CGContextStrokePath(c)CGContextStrokeRect(c, rect),则显示笔划.

因为该函数在抚摸之前将该矩形的路径添加到当前绘图路径.