3

破線

このコードを使用して、幅の広い破線の黒い線で NSBezierPath をストロークしています。

(cそして、strForBezier別の場所で定義されています)

NSGlyph glyph;
for(n = 0; n < len; n++) {
    glyph = [font glyphWithName: [strForBezier substringWithRange:NSMakeRange(n, 1)]];
    [path appendBezierPathWithGlyph: glyph inFont: font];
}

CGFloat pattern2[4]; pattern2[0]=5*c; pattern2[1]=2*c; pattern2[2]=2*c; pattern2[3]=2*c;
[path setLineDash:pattern2 count:4 phase:0];

[path setLineWidth:c];
[path stroke];
[[NSColor blueColor] set ];
[path fill];

黒の NSBezierPath を取得するにはどうすればよいですか? 私は、NSBezierPath が構築され、最初の曲線を描くために塗りつぶされていると仮定しています。

4

1 に答える 1

3

既存のパスをダッシュ​​してストロークすることでパスを作成できますが、CGPathRef代わりにを使用する必要がありNSBezierPathます。

CGMutablePathRef path0 = CGPathCreateMutable();
CGAffineTransform transform = CGAffineTransformMakeTranslation(20, 20);
// initial position is {20, 20}

CGGlyph glyph;
for(n = 0; n < len; n++)
{
    glyph = [font glyphWithName: [strForBezier substringWithRange:NSMakeRange(n, 1)]];
    CGPathRef glyphPath = CTFontCreatePathForGlyph((__bridge CTFontRef) font, glyph, NULL);
    CGPathAddPath(path0, &transform, glyphPath);
    CGPathRelease(glyphPath);

    // append the glyph advance to the transform
    CGSize advance;
    CTFontGetAdvancesForGlyphs((__bridge CTFontRef) font, kCTFontDefaultOrientation, &glyph, &advance, 1);
    transform.tx += advance.width;
    transform.ty += advance.height;
}

CGFloat pattern2[4]; pattern2[0]=5*c; pattern2[1]=2*c; pattern2[2]=2*c; pattern2[3]=2*c;
CGPathRef path1 = CGPathCreateCopyByDashingPath(path0, NULL, 0, pattern2, 4);
CGPathRef path2 = CGPathCreateCopyByStrokingPath(path1, NULL, c, kCGLineCapButt, kCGLineJoinMiter, CGFLOAT_MAX);

CGContextRef context = [NSGraphicsContext currentContext].graphicsPort;
CGContextAddPath(context, path2);
CGContextDrawPath(context, kCGPathFill);

CGPathRelease(path0);
CGPathRelease(path1);
CGPathRelease(path2);

に慣れていない場合はCGPathRef、 を作成してから、Apple のドキュメント「 Building a CGPathRef From a NSBezierPath Object」で説明されている方法を使用してNSBezierPathに変換できます(逆も可能です)。CGPathRef

于 2012-07-09T21:07:24.100 に答える