Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在核心图形中将笔划应用于圆角矩形_Iphone_Uitableview_Core Graphics_Drawrect_Stroke - Fatal编程技术网

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

Iphone 在核心图形中将笔划应用于圆角矩形,iphone,uitableview,core-graphics,drawrect,stroke,Iphone,Uitableview,Core Graphics,Drawrect,Stroke,我有一个具有圆角的渐变,我可以将其用于自定义UITableViewCell背景。我试图在路径上画一个笔划,但做不到,也看不出哪里出了问题 CGFloat minx = CGRectGetMinX(rect) , midx = CGRectGetMidX(rect), maxx = CGRectGetMaxX(rect) ; CGFloat miny = CGRectGetMinY(rect) , maxy = CGRectGetMaxY(rect) ; minx = minx + 1

我有一个具有圆角的渐变,我可以将其用于自定义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);
此代码将矩形向右舍入并应用渐变,但不划行。我的错在哪里



编辑: 根据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);
但是直肠是这样出来的

…没有边界。如果我将
CGContextStrokePath(c)
更改为
CGContextStrokeRect(c,rect)
,则会显示笔划(为了澄清,我将其设置为红色)。但不知何故,当我抚摸这条路时,我没有得到任何抚摸:(


不确定,但可能是在笔划上绘制渐变?

不确定,但可能是在笔划上绘制渐变?

或者是在笔划上绘制渐变,或者是剪裁笔划区域

我认为以下方法可能更有效:

CGContextSaveGState(c);
CGContextClip(c);

//gradient drawing stuff

CGContextRestoreGState(c);
CGContextStrokePath(c);

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

您要么在笔划上绘制渐变,要么剪裁笔划区域

我认为以下方法可能更有效:

CGContextSaveGState(c);
CGContextClip(c);

//gradient drawing stuff

CGContextRestoreGState(c);
CGContextStrokePath(c);

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

为了响应您修订的代码,我引用文档:

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

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

-

因此,当前绘图路径不是图形状态的一部分。下面是您正在执行的操作:

  • 构建图形路径
  • 保存gstate
  • 将当前绘图路径添加到剪裁路径;清除当前绘图路径
  • 绘制坡度
  • Restore gstate(恢复上一个剪裁路径;图形路径保持为空)
  • 什么也不做
  • 解决方案是将路径绘制到CGPath对象中,然后在剪切(保存gstate后)和笔划之前将其添加为当前路径

    你还应该决定这是外部笔划、内部笔划还是中心笔划。对于中心笔划,在不剪裁的情况下进行笔划。对于内部笔划,在剪裁的情况下进行笔划。对于外部笔划,反转路径,然后剪裁,然后再进行笔划。对于最后两种形式,你都需要加倍线宽,因为你将e删掉一半的笔划

    如果我将
    CGContextStrokePath(c)
    更改为
    CGContextStrokeRect(c,rect)
    ,则会显示笔划


    因为该函数在笔划之前将该矩形的路径添加到当前绘图路径中。

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

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

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

    -

    因此,当前绘图路径不是图形状态的一部分。下面是您正在执行的操作:

  • 构建图形路径
  • 保存gstate
  • 将当前绘图路径添加到剪裁路径;清除当前绘图路径
  • 绘制坡度
  • Restore gstate(恢复上一个剪裁路径;图形路径保持为空)
  • 什么也不做
  • 解决方案是将路径绘制到CGPath对象中,然后在剪切(保存gstate后)和笔划之前将其添加为当前路径

    你还应该决定这是外部笔划、内部笔划还是中心笔划。对于中心笔划,在不剪裁的情况下进行笔划。对于内部笔划,在剪裁的情况下进行笔划。对于外部笔划,反转路径,然后剪裁,然后再进行笔划。对于最后两种形式,你都需要加倍线宽,因为你将e删掉一半的笔划

    如果我将
    CGContextStrokePath(c)
    更改为
    CGContextStrokeRect(c,rect)
    ,则会显示笔划


    因为该函数在绘制笔划之前将该矩形的路径添加到当前绘制路径中。

    我不这样认为。我在更新代码中的渐变之后绘制笔划。我不这样认为。我在更新代码中的渐变之后绘制笔划。还有一个问题:您是否调用了CGContextBeginPath(c)某个地方?如果没有,那可能是个问题。我没有。我已经更新了代码,以显示在绘制单元格的代码的这一部分之前的内容。如果删除所有剪裁、渐变绘制以及保存和恢复图形状态的内容,是否绘制了路径?如果是,Peter Hoseys的答案可能是正确的。还有一个问题:您有ca吗ll到CGContextBeginPath(c)某个地方?如果没有,那可能是个问题。我没有。我已经更新了代码,以显示在绘制单元格的代码的这一部分之前的内容。如果删除所有的剪裁、渐变绘制以及保存和恢复图形状态的内容,是否绘制了路径?如果是,Peter Hoseys的答案可能是正确的。为什么当前路径被清除n设置剪辑路径?CGContextClip的文档没有提到这一点。subw:是的,他们提到了。“确定新剪辑路径后,函数会将上下文的当前路径重置为空路径。”之所以这样做,是因为PostScript(PDF的直接祖先)就是这样做的。这很有意义。我将尝试一下