2012-02-16 20 views
5

他の人が行ったように、私はCALayerのバックビューでうまく見えるテキストを取得しようとしています。私が見つけた最も関連性の高いスレッドはFaking Subpixel Antialiasing on Text with Core Animationです。テキスト不透明な背景を持つCALayerでのアンチエイリアス

この記事の冒頭で「現在、テキストに対して不透明な背景を設定できる人(setBackgroundColor:呼び出しまたはInterface Builderの同等の設定を使用)の場合、この問題は発生しません。問題があまりにも多い」しかし、私はIBのテキストボックスの背景を設定し、背景を描画し、そのセルで同じことをすると、私はまだ同じ問題(レイヤが使用されている場合はアンチエイリアスなし)を得ています。これらはバックグラウンドを描画するNSBoxに属します。

私は何をしなければならないと思っていますか?ありがとう

答えて

3

レイヤーでカスタム図面を作成するときは、CGContextFillRect()を不透明な色で使用し、その矩形の上に文字列を描画してサブピクセルのアンチエイリアス処理を行う必要があります。

layer.backgroundColorを設定すると、レイヤの内容を再描画せずにlayer.backgroundColorを変更できる可能性があります。

+0

あなたはそれが不十分なレンダリングしないように文字列を描画する方法の例を持っていません - 私の試みはうまくいかなかった。 – Sam

+0

@Sam 'layer.contentsScale'を' [UIScreen mainScreen] .scale'に設定してください。 –

+0

美しい。これは完全に機能しました。私はlayer.backgroundColorを完全に不透明な色に設定していましたが、テキストを描画する前にその色を塗りつぶしていませんでした。すぐに、テキストが完全にレンダリングされました。ありがとう! – Bryan

0

単純に不透明な背景のテキストを取得し、CATextLayerを使って頭を壁に当てようとしている場合は、NSTextFieldをあきらめて、insetを無効にし、linefragmentpaddingを0に設定して使用してください。簡単に変換することができる...私のために

var testV = NSTextView() 
testV.backgroundColor = NSColor(calibratedRed: 0.73, green: 0.84, blue: 0.89, alpha: 1) 
testV.frame = CGRectMake(120.0, 100.0, 200.0, 30.0) 
testV.string = "Hello World!" 
testV.textContainerInset = NSZeroSize 
testV.textContainer!.lineFragmentPadding = 0 
self.addSubview(testV) 

がにテキスト同等が表示されます。

var testL = CATextLayer() 
testL.backgroundColor = NSColor(calibratedRed: 0.73, green: 0.84, blue: 0.89, alpha: 1).CGColor 
testL.bounds = CGRectMake(0.0, 0.0, 200.0, 30.0) 
testL.position = CGPointMake(100.0, 100.0) 
testL.string = "Hello World!" 
testL.fontSize = 14 
testL.foregroundColor = NSColor.blackColor().CGColor 
self.layer!.addSublayer(testL) 
関連する問題