2

私は途方に暮れています。ぼやけを取り除くためにすべてだと思うことを試してみましたが、CATextLayer役に立ちませんでした。確かに、いくつかのことは役に立ちますが、テキストは 2 倍に拡大するとまだぼやけすぎており、CATextLayerテキスト以外の鮮明さにはほど遠いものです。

これが私の状況です。CATextLayers(カスタムCALayerコンテナー内)を含む多くのサブレイヤーを含めることができるレイヤー ホスト ビューがあります。これで、ユーザーはメイン コンテンツ レイヤー (すべてのサブレイヤー コンテンツを含む) をズームできます。これは、スケール変換をコンテンツ レイヤーに適用することによって行われます。

これが私が現在行っていることです。大きな違いではありませんが、ほとんどの場合違いがあります。完全にズームインすると (倍率が 2 倍になります)、テキストがひどくぼやけてしまいます。

  • 積分座標を確認する - 機能し、かなりの違いが生じますが、2x スケールではまだぼやけすぎています

  • CATextLayerコンテナー レイヤーの影をオフにします - 2 倍のスケールではありませんが違いが生じます

  • テキストレイヤーの背景色が完全に不透明であることを確認してください - 2倍のスケールではありませんが、違いがあるようです

  • contentsScaleプロパティをすべてのレイヤーのウィンドウバッキングスケールファクターに設定します-2倍のスケールではありませんが、違いがあるようです

  • -drawInContext:このカスタムサブクラスをオーバーライドCATextLayerして、すべてをスムーズ、アンチエイリアス、およびサブピクセル量子化します。フォントはより忠実にレンダリングされますが、2 倍スケールではまだぼやけています。

コードフラグメント:

- (void) drawInContext:(CGContextRef)context
{
    // Allow font smoothing.
    CGContextSetAllowsAntialiasing(context, YES);
    CGContextSetAllowsFontSmoothing(context, YES);
    CGContextSetAllowsFontSubpixelPositioning(context, YES);
    CGContextSetAllowsFontSubpixelQuantization(context, YES);

    // Set drawing attributes.
    CGContextSetStrokeColorWithColor(context, self.foregroundColor);
    CGContextSetFillColorWithColor(context, self.backgroundColor);
    CGContextFillRect(context, self.bounds);

    // Font smoothing.
    CGContextSetShouldAntialias(context, YES);
    CGContextSetShouldSmoothFonts(context, YES);
    CGContextSetShouldSubpixelPositionFonts(context, YES);
    CGContextSetShouldSubpixelQuantizeFonts(context, YES);

    [super drawInContext:context];
}

私は何が欠けていますか?

4

1 に答える 1

1

可能な限り鮮明なテキストの場合、元の質問で述べたすべてに加えて、最大の影響を与える解決策は、contentsScaleテキスト レイヤーの値を 2 倍にして、ウィンドウ バッキング スケール ファクターを 2 倍にすることです (2 倍ズームで鮮明なテキストをサポートする場合)。

より高いズーム値で鮮明なテキストをサポートする場合は、アプリケーションの最大ズーム係数を調整済み として使用しますcontentsScale。たとえば-setContentsScale:、カスタムCATextLayerサブクラスをオーバーライドすることでこれを行うことができます。

- (void) setContentsScale:(CGFloat)contentsScale
{
    [super setContentsScale:contentsScale * kMaxZoomFactor];
}

ビュー バッキング プロパティへの変更 (より高い解像度の画面への変更など) は-viewDidChangeBackingProperties、レイヤー ホスト ビューをオーバーライドすることによって、レイヤー ホスト階層に伝播されることを確認してください。

- (void) viewDidChangeBackingProperties
{
    // Propagate self.window.backingScaleFactor change to layer hierarchy.
}
于 2015-10-19T22:05:06.103 に答える