10

私のアプリでは、パスに沿ってテキストをレンダリングしようとしています。これはほとんどのキャラクターには問題ありませんが、日本語(またはmac-Roman以外のもの)には問題ありません。CATiledLayerに正しい文字を表示する[NSStringdrawAtPoint]を使用することをお勧めします。ただし、約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が言うように、これはほとんど必要ありません。通常、スタックにはコンテキストと同じ(希望する!)「動作する」コンテキストがすでに存在しますが、彼が指摘するように、存在しない場合もあります。特にMapKitでこの問題を発見しましたMKOverlayRenderer。これdrawMapRect:は、コンテキストを明示的に設定しないとテキストを表示しません。

于 2015-05-02T09:48:40.410 に答える