2011-07-10 2 views
1

QuartzでテキストをNSViewCGContextShowTextAtPoint()で描画しようとしています。これは、(BOOL)isFlippedを私のNSViewサブクラスに返すようにYESをオーバーライドするまでうまくいき、描画の左上に原点を配置しました。テキストは予想される領域に描画されますが、文字はすべて反転されます。私はまた、(理論的には、少なくとも)CGContextを反転させ、文脈の高さで翻訳することを試みました。CGContextShowTextAtPointは逆さまにレンダリングする

e.x。

// drawRect: 
CGContextScaleCTM(theContext, 1, -1); 
CGContextTranslateCTM(theContext, 0, -dirtyRect.size.height); 

これは、同じ結果をもたらす。

同様の問題に対する多くの提案は、テキストマトリックスの変更を指摘しています。私はテキストマトリックスを単位行列に設定し、追加の逆行列を実行して、両方を実行しました。これらのすべての解決策は、テキストの奇妙なレンダリングにつながります(たぶんフラグメントが現れます)。

私が見たもう一つの提案は、この機能を他の方法で描画することでした(例:NSString's描画方法。)しかし、これは主にC++/Cの間で行われており、可能であればこれらのレベルにとどまりたいと思います。

ご意見は大変ありがとうございます。必要に応じてさらにコードを投稿していただきたいと思います。

CGContextTranslateCTM(theContext, 0, -NSHeight(self.bounds)); 
CGContextScaleCTM(theContext, 1, -1); 

答えて

0

は答えはテキスト行列を変更することでしたが判明:

おかげで、 サム

1

あなたがdirtyRectではなく、ビューの境界を使用して、スケールの前に翻訳を実行する必要があります。テキストの代わりに表示されていた奇妙な「断片」は、「デフォルトの」テキストマトリックスが置き換えられたときに、フォントサイズ(CGContextSelectFont()で設定)が小さすぎたためです。初期の行列は何らかの理由で大規模な変換をしていたので、行列が変更されていないときは小さな文字サイズが細かく見えました。逆スケール(1、-1)や恒等行列に置き換えた場合、それらは判読不能に小さくなる。

+0

ご注文ありがとうございます。あなたのコードを直接使用すると、描画がオフスクリーンでレンダリングされ、NSHeight(...)へのNSHeight(...)の変更によって原点が正しく変更されましたが、テキストの問題は残りました。 – Sam

2

この質問は回答済みですhere

基本的には、iOSのコアグラフィックスの座標系が、Mac上の座標系とは反対に(左上のx:0, y:0)フリップされているためです(x:0, y:0は左下です)。これの解決策は、テキスト変換マトリックスを次のように設定していることです。

CGContextSetTextMatrix(context, CGAffineTransformMake(1.0,0.0, 0.0, -1.0, 0.0, 0.0)); 
関連する問題