10

在我的应用程序中,我试图沿路径呈现文本;这对大多数字符都很好,但对日语(或任何非 mac-Roman)来说不是。有人建议我使用 [NSString drawAtPoint] 在我的 CATiledLayer 中显示正确的字符;但是,它们会在大约 5 秒后消失。在这个时候,我可以缩放图层并且它们可以正确缩放,但它们似乎不像文本的其余部分那样致力于 CATiledLayer。

在渲染之前,我会检查字符串并决定它们中的任何一个是否不可渲染。如果我遇到问题,我会使用 drawAtpoint 代替:

if (!isFullyDisplayable)
 {
  CGContextShowGlyphsAtPoint(context, pt.x, pt.y, realGlyph, 1);
 }
 else {
  // fall back on less flexible font rendering for difficult characters

  NSString *b = [gv text];
  NSString *c = [b substringWithRange:NSMakeRange(j,1)];

  [c drawAtPoint:pt withFont:[UIFont fontWithName:@"Helvetica-Bold" size:16.0]];


 }

有没有人对为什么文本消失有任何指示?

一旦使用了drawAtPoint,我的调试输出就会被淹没:

<Error>: CGContextGetShouldSmoothFonts: invalid context
<Error>: CGContextSetFont: invalid context
<Error>: CGContextSetTextMatrix: invalid context
<Error>: CGContextSetFontSize: invalid context
<Error>: CGContextSetTextPosition: invalid context
<Error>: CGContextShowGlyphsWithAdvances: invalid context

所以我猜这与我的上下文管理有关,但我认为如果这与我使用 CGContextShowGlyphsAtPoint 在同一个地方,它应该已经有正确的上下文了吗?

4

2 回答 2

17

回答我自己的问题:

NSString drawAtPoint:withFont: 使用上下文堆栈,并且从我调用此方法的位置堆栈为空。用

UIGraphicsPushContext(context); and UIGraphicsPopContext();

成功了。

于 2010-03-04T11:50:38.417 回答
1

为了完整起见,这里是 Cocoa 所需的代码。也适用于.drawInRect...

CGContextSaveGState(context)
let old_nsctx = NSGraphicsContext.currentContext() // in case there was one
// force "my" context...
NSGraphicsContext.setCurrentContext(NSGraphicsContext(CGContext: context, flipped: true)) 

// Do any rotations, translations, etc. here
str.drawAtPoint(cgPt, withAttributes: attributes)

NSGraphicsContext.setCurrentContext(old_nsctx)// clean up for others
CGContextRestoreGState(context)

正如@davbryn 所说,这主要是不需要的,因为通常堆栈上已经有一个“工作”上下文与您的上下文相同(您希望!),但是,正如他指出的那样,有时没有。我发现了这个问题,特别是 MapKitMKOverlayRendererdrawMapRect:,它根本不会在没有明确设置上下文的情况下显示文本。

于 2015-05-02T09:48:40.410 回答