2

品質の低いiOSをレンダリングしてUIViewからPDFを生成する

と呼ばれるカスタムUIViewがありTTT_WantsToBeRazorSharpViewます。このビューは何もしませんが、テキストを描画します

NSString*txtPleaseHelp = NSLocalizedString(@"Hello, am I blurry again?",@"");
CGContextShowTextAtPoint(ctx, 10, 50, [txtPleaseHelp cStringUsingEncoding:NSMacOSRomanStringEncoding], [txtPleaseHelp length]);

これで、ビューは3回UIViewController(で1回IB)、コードで2回、これらの線で描画されます(下の画像と比較してください)。

 TTT_WantsToBeRazorSharpView *customViewSharp = [[TTT_WantsToBeRazorSharpView alloc] initWithFrame:CGRectMake(10,250, 300, 80)];
 [self.view addSubview:customViewSharp];

 TTT_WantsToBeRazorSharpView *customViewBlurryButIKnowWhy = [[TTT_WantsToBeRazorSharpView alloc] initWithFrame:CGRectMake(361.5, 251.5, 301.5, 80.5)];
 [self.view addSubview:customViewBlurryButIKnowWhy];

最初のコード描画ビューはrazorsharpですが、2番目はそうではありませんが、rectのコンマ値(361.5、251.5、301.5、80.5)があるため、問題ありません。

この写真を参照してください: この写真を見る

しかし、私の問題は、ビューをPDFドキュメントにレンダリングすると、ぼやけてしまうことです。そして、理由がわからない、ここを参照してください: ぼやけたpdf

およびPDFファイル自体Test.pdfhttps ://raw.github.com/florianbachmann/GeneratePDFfromUIViewButDontWantToLooseQuality/master/Test.pdf

ビューをPDFにレンダリングするための行:

//this is blurry, but why? it can't be the comma coordinates
CGRect customFrame1 = CGRectMake(10,50, 300, 80);
TTT_WantsToBeRazorSharpView *customViewSharp = [[TTT_WantsToBeRazorSharpView alloc] initWithFrame:customFrame1];
CGContextSaveGState(context);
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, (int)customFrame1.origin.x, (int)customFrame1.origin.y);
[customViewSharp.layer renderInContext:context];
CGContextRestoreGState(context);

では、なぜrenderInContext:contextテキストがぼやけているのでしょうか。

私はあなたのすべてのヒントと助けに感謝します、私はあなたの勇敢な人のためにGitHubプロジェクトを作りました(ソース付き):https ://github.com/florianbachmann/GeneratePDFfromUIViewButDontWantToLooseQuality

4

3 に答える 3

1

これを試して:

- (void)initValues {
    UIColor *gray = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.3f];
    CALayer *l = [self layer];
    l.masksToBounds = YES;
    l.cornerRadius = 10.0f;
    l.borderWidth = 3.0f;
    self.backgroundColor = gray;
    l.backgroundColor = gray.CGColor;
    l.borderColor = gray.CGColor;
}

- (void)drawRect:(CGRect)rect {
    NSLog(@"TTT_WantsToBeRazorSharpView drawRect[%3.2f,%3.2f][%3.2f,%3.2f]",rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);

    // get the graphic context
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetShouldSmoothFonts(ctx,YES);

    CGColorRef colorWhite = CGColorRetain([UIColor redColor].CGColor);

    CGContextSetFillColorWithColor(ctx, colorWhite);

    CGContextSelectFont(ctx, "Helvetica-Bold", 24, kCGEncodingMacRoman);
    CGAffineTransform tranformer = CGAffineTransformMakeScale(1.0, -1.0);
    CGContextSetTextMatrix(ctx, tranformer);

    //why is this sucker blurry?
    NSString*txtPleaseHelp = NSLocalizedString(@"Hello, am I blurry again?",@"");
    CGContextShowTextAtPoint(ctx, 10, 50, [txtPleaseHelp cStringUsingEncoding:NSMacOSRomanStringEncoding], [txtPleaseHelp length]);
    CGColorRelease(colorWhite);
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {

    if (!layer.shouldRasterize && !CGRectIsEmpty(UIGraphicsGetPDFContextBounds())) {
        [self drawRect:self.bounds];
    }
    else {
        [super drawLayer:layer inContext:ctx];
    }
}

テキストを表示するには、テキストの色を赤に変更する必要がありました。テキストが最初に書き込まれ、次に透明な灰色のボタンがその上に配置されるため、白いテキストが消えます。drawLayerメソッドを追加すると、ラスタライズする必要のないものはすべてベクターとしてpdfに書き込まれるため、テキストも選択可能になります。

于 2012-09-24T13:55:27.797 に答える
0

次のコマンドを使用して、ぼやけたテキストを修正しました。

    self.frame = CGRectIntegral(self.frame);

テキストがぼやける理由は、位置合わせが理想的ではなかったためです。つまり、ポイント座標の小数値であるため、過度のアンチエイリアスが原因でテキストがぼやけて表示されます。

于 2012-09-24T13:45:45.610 に答える
0

ビュー内のテキストは、ベクターグラフィックとしてではなく、PDF内のビットマップとしてレンダリングされるため、ぼやけた外観になります。私の推測では、iOSレンダリングエンジンは中間ビットマップにテキストを描画し(色合成の目的で)、このビットマップはターゲットコンテキストにレンダリングされます。

于 2012-09-24T13:05:47.240 に答える