我有一个梯度,即具有圆角,我一个用于一个自定义用表的背景。我想要应用程的路径,但不能完全做到这一点,并且看不到我在哪里出错。

  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文本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文本http://grab.by/2714

...没有边界。如果我改变的 CGContextStrokePath(c)CGContextStrokeRect(c, rect), 冲程显示出来(我做了红澄清).但不知何故,当抚摸的道路,我没有得到任何行程:(

alt文本http://grab.by/27aM

有帮助吗?

解决方案

应对你的修订编码,我引用的文件:

不同于目前的道路,目前的剪切路径的一部分的图形态。因此,为重新扩大的可绘制的地区通过恢复裁剪路径以前的状态,必须保存的图形状态之前你剪辑和恢复的图形状态之后你完成了任何剪辑画。

之后确定的新的削的道路,该功能将重置的上下文的当前道路的一个空的道路。

CGContextClip

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

  1. 建立绘制的路径
  2. 保存gstate
  3. 添加当前绘制的路径剪报路径; 清除当前绘制的路径
  4. 绘制度梯度
  5. 恢复gstate(先前的剪切路径是恢复;绘制的路径仍然是空的)
  6. 没有什么行程

解决的办法是绘制的路径进入一个CGPath对象,那么添加这作为当前的道路前剪报(后节省的gstate)和前抚摸。

你也应该决定是否希望这是一个外行程中,一个内部行程,或者为中心的行程。为了为中心的行程,中风而不剪切。对于一个内部行程,行程,同时剪切。对于外部行程,扭转的道路,然后剪辑的,随后的行程。你会想你的双线宽度为两者的最后两种形式,因为你会被剪辑了一半的行程。

如果我改变的 CGContextStrokePath(c)CGContextStrokeRect(c, rect), 冲程显示出来。

因为这一职能增加了一个路径的矩形的当前绘制的路径之前,抚摸。

其他提示

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

您正在绘制或者在行程的梯度,和/或限幅的区域你中风。

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

CGContextSaveGState(c);
CGContextClip(c);

//gradient drawing stuff

CGContextRestoreGState(c);
CGContextStrokePath(c);

当然,还必须设置笔划颜色和宽度正常。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top