gpt4 book ai didi

objective-c - 为什么 Helvetica Neue Bold 字形不会在 NSBezierPath 中绘制为普通子路径?

转载 作者:太空狗 更新时间:2023-10-30 03:29:33 27 4
gpt4 key购买 nike

我想要的是取一个填充的矩形并使用另一种形状在其中打一个洞。这正是 NSBezierPath 设计的目的。您添加一个矩形路径,然后添加将“穿透”它并最终填充它的子路径。在我的例子中,子路径实际上是文本。没问题,效果很好:

alt text

除非我使用 Helvetica Neue Bold 作为我的字体。当我使用它时,我最终得到一个没有任何文本的纯蓝色矩形。但是子路径确实在绘制——事实上,如果我将填充的矩形缩小一点,你实际上可以看到一些文本路径:

alt text

我在使用 Helvetica Neue Italic 时得到了相同的行为。 Helvetica Neue Medium 效果很好,Helvetica Bold、Times New Roman Bold 和 Arial Bold 也是如此。

我试过同时使用 NSEvenOddWindingRuleNSNonZeroWindingRule。 (编辑:显然我并没有真正尝试过 NSEvenOddWinding 规则,因为事实证明它确实有效)

这是我在 NSView 子类的 drawRect 方法中使用的代码。

NSLayoutManager *layoutManger = [[[NSLayoutManager alloc] init] autorelease];
NSTextContainer *textContainer = [[[NSTextContainer alloc]
initWithContainerSize:NSMakeSize(300, 100)] autorelease];

NSFont *font = [NSFont fontWithName:@"Helvetica Neue Bold" size:100];

NSDictionary *textAttribs = [NSDictionary dictionaryWithObjectsAndKeys:
font, NSFontAttributeName, nil];

NSTextStorage *textStorage = [[[NSTextStorage alloc] initWithString:@"Hello"
attributes:textAttribs] autorelease];

[layoutManger addTextContainer:textContainer];
[layoutManger setTextStorage:textStorage];

NSRange glyphRange = [layoutManger glyphRangeForTextContainer:textContainer];

NSGlyph glyphArray[glyphRange.length];

NSUInteger glyphCount = [layoutManger getGlyphs:glyphArray range:glyphRange];

NSBezierPath *path = [NSBezierPath bezierPathWithRect:NSMakeRect(0, 0, 200, 100)];
[path appendBezierPathWithGlyphs:glyphArray count:glyphCount inFont:font];

[[NSColor blueColor] setFill];

[path fill];

那么这里发生了什么?在向路径添加字形时,为什么某些字体的行为与其他字体不同?

编辑:解决方案是使用NSEvenOddWindingRule。创建路径后添加这一行:

[path setWindingRule:NSEvenOddWindingRule];

Peter Hosey 的回答解释了为什么会这样。

最佳答案

这可能与字体中路径的方向有关。一种字体可能使用顺时针路径;另一个可能使用逆时针路径。

实现您想要的效果的更可靠方法是简单地填充矩形,然后将图形上下文的合成模式设置为 NSCompositeSourceOut,然后从中绘制文本。如果您只想从填充中剪切文本,则可以使用 Core Graphics 将填充和文本绘制包裹在透明层中。

关于objective-c - 为什么 Helvetica Neue Bold 字形不会在 NSBezierPath 中绘制为普通子路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4742773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com