iPhone:单独的描边和填充不起作用

Posted

技术标签:

【中文标题】iPhone:单独的描边和填充不起作用【英文标题】:iPhone: Separate Stroke and Fill not working 【发布时间】:2012-09-17 22:08:24 【问题描述】:

我有以下代码:

    if (self.graphic.fillColor)
    
        CGContextSetFillColorWithColor(context, self.graphic.fillColor);
        CGContextDrawPath(context, kCGPathFill);
    

    if (self.graphic.strokeColor)
    
        CGContextSetStrokeColorWithColor(context, self.graphic.strokeColor);
        CGContextSetLineWidth(context, self.graphic.strokeWidth);
        CGContextDrawPath(context, kCGPathStroke);
    

在某个实例中,我正在加载一个具有fillColorstrokeColor 的图形对象。当我这样做时,填充已完成,但根本没有绘制笔画(我已经仔细检查过分配笔画值是否有任何错误,一切看起来都很好)。为什么是这样?如果你同时做这两个,你需要同时做它们,即在一个CGContextDrawPath

【问题讨论】:

【参考方案1】:

当您调用 CGContextDrawPath 时,CoreGraphics 绘制(填充或描边)您之前添加到上下文中的 CGPathRef然后从该上下文中删除 CGPathRef用过。

因此,如果您在第一个“if”条件中调用了CGContextDrawPath,您只需将CGPathRef 重新添加到您的上下文中,然后才能再次绘制它。


此外,仅当您需要填充或描边(或两者)并且如果fillColorstrokeColor 都不是零(ne如果您不会填充或描边,则需要构建/添加您的路径)。

正如您自己指出的那样,无论如何,填充和描边都有一个常量,称为kCGPathFillStroke。所以你的代码可能看起来像这样:

// Don't draw anything if both colors are nil
if (self.graphic.fillColor || self.graphic.strokeColor)

  // Build and add your CGPathRef here
  CGPathRef path = ...
  CGContextAddPath(context, path);

  // Then either fill, stroke, or fillstroke the path.
  CGPathDrawingMode mode;
  if (self.graphic.fillColor)
  
    CGContextSetFillColorWithColor(context, self.graphic.fillColor);
    mode = kCGPathFill;
  
  if (self.graphic.strokeColor)
  
    CGContextSetStrokeColorWithColor(context, self.graphic.strokeColor);
    CGContextSetLineWidth(context, self.graphic.strokeWidth);
    // if we also have a fillcolor, use fillstroke mode. Else just use stroke.
    mode = (self.graphic.fillColor) ? kCGPathFillStroke : kCGPathStroke;
  
  CGContextDrawPath(context, mode);

这样:

如果只有fillColor,没有strokeColor,则只设置填充颜色,使用kCGPathFill。 如果只有strokeColor而没有fillColor,则只设置描边颜色和线条,使用kCGPathStroke 如果您指定了两种颜色,您将同时设置填充颜色、描边颜色和线条,并使用kCGPathFillStroke

【讨论】:

感谢您这么长的回复。在两者兼有的情况下使用 kCGPathFillStroke 是否更有效? 确实!我忘记了这个可以同时描边和填充的常量的存在;)将相应地编辑我的答案!

以上是关于iPhone:单独的描边和填充不起作用的主要内容,如果未能解决你的问题,请参考以下文章

iPhone X上的imageView约束不起作用

经常性NN:参数共享的重点是什么?无论如何填充都不起作用?

React Native - 为啥填充不起作用?

填充 NSString 不起作用

相机视图在 iPhone 上不起作用,在另一个上起作用

媒体查询在 chrome 中不起作用,但在 iphone 上起作用