如何在Cocoa中使用两种交替颜色描绘虚线CGPath?

时间:2013-08-25 08:44:48

标签: objective-c cocoa core-graphics cashapelayer

我想用两种交替颜色(例如黑色和白色,想想Preview.app选择框)来描绘CAShapeLayer的路径。我不知道如何做到这一点,或者是否可以使用Quartz。

我已将CAShapeLayer设置为具有白色边框,然后将path属性设置为黑色虚线。我希望这应该产生黑白虚线的效果。但是,似乎首先绘制路径,边框在顶部被描边,看截图(毛皮属于我的猫),

CAShapeLayer with white border and black stroked path, the path is drawn first followed yb the border.

任何人都可以提出更好的方法或方法来实现这一目标吗?

代码,

// Stroke a white border
[shapeLayer setFrame:shapeRect];
[shapeLayer setBorderColor:[[NSColor whiteColor] CGColor]];
[shapeLayer setBorderWidth:1.0];

// Stroked a black dash path (along the border)
// and fill shape with clear colour
[shapeLayer setFillColor:[[NSColor clearColor] CGColor]];
[shapeLayer setStrokeColor:[[NSColor blackColor] CGColor]];
[shapeLayer setLineWidth:1.0];
[shapeLayer setLineJoin:kCALineJoinRound];
[shapeLayer setLineDashPattern:
 [NSArray arrayWithObjects:[NSNumber numberWithInt:5],
  [NSNumber numberWithInt:5],
  nil]];

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, shapeLayer.bounds);
[shapeLayer setPath:path];
CGPathRelease(path);

2 个答案:

答案 0 :(得分:2)

我认为这种方法存在两个问题(混合图层边框和形状笔划)

  1. 边界位于边界(边界内),但笔划是从中心(路径)进行的。
  2. 在路径被激活后绘制边框
  3. 你可以通过插入strokeWidth的路径一半

    来做一些关于#1的事情
    CGFloat halfWidth = 1.0/2.0;
    CGPathAddRect(path, NULL, CGRectInset(shapeLayer.bounds, halfWidth, halfWidth));
    

    然而,边框仍将被绘制在形状之上(至少我不知道如何更改顺序)。

    我认为最简单的解决方案是必须在同一容器层中对图层进行整形。容器将用于更改框架,两个图层将用于绘图。

    底层将具有白色笔划(无划线图案),顶层将具有黑色虚线笔划。由于两个形状都具有相同的路径,因此它看起来像黑色和白色的虚线图案。

    这样做也适用于任何形状。

答案 1 :(得分:0)

您是否尝试使用lineDashPhase属性?使用它,你可以先用黑色显示虚线,稍后用相同路径显示白色变换颜色和lineDashPhase。