6

私は非常に単純なことをしようとしています: ユーザーが実際にクリックできる URL を PDF ファイル内に記述します。

libharuを使えばできることは確かです。私が探しているのは、アプリに既にあるコード全体が既にこれらのメソッドを使用しているため、Core Graphics を使用して同じことを行うことです。

== 編集 ==

何かを見つけたと思いますUIGraphicsSetPDFContextURLForRectが、うまくいきません。

私は次のようなものを使用しています:

NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
UIGraphicsSetPDFContextURLForRect( url, CGRectMake(0, 0, 100, 100));

ただし、四角形はクリックできません。

4

2 に答える 2

16

わかりました、なぜそれが機能しなかったのかを理解することができました。

コア グラフィックス コンテキストは、原点がページの左下にあるのに対し、UIKit の原点は左上隅にあるという意味で「反転」しています。

これは私が思いついた方法です:

- (void) drawTextLink:(NSString *) text inFrame:(CGRect) frameRect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGAffineTransform ctm = CGContextGetCTM(context);

    // Translate the origin to the bottom left.
    // Notice that 842 is the size of the PDF page. 
    CGAffineTransformTranslate(ctm, 0.0, 842);

    // Flip the handedness of the coordinate system back to right handed.
    CGAffineTransformScale(ctm, 1.0, -1.0);

    // Convert the update rectangle to the new coordiante system.
    CGRect xformRect = CGRectApplyAffineTransform(frameRect, ctm);

    NSURL *url = [NSURL URLWithString:text];        
    UIGraphicsSetPDFContextURLForRect( url, xformRect );

    CGContextSaveGState(context);
    NSDictionary *attributesDict;
    NSMutableAttributedString *attString;

    NSNumber *underline = [NSNumber numberWithInt:NSUnderlineStyleSingle];
    attributesDict = @{NSUnderlineStyleAttributeName : underline, NSForegroundColorAttributeName : [UIColor blueColor]};
    attString = [[NSMutableAttributedString alloc] initWithString:url.absoluteString attributes:attributesDict];

    [attString drawInRect:frameRect];

    CGContextRestoreGState(context);
}

このメソッドが行うことは次のとおりです。

  • 現在のコンテキストを取得し、提供された四角形に変換を適用して、ボックスUIGraphicsSetPDFContextURLForRectをクリック可能としてマークするときにボックスをマークするときに機能する四角形を取得します
  • xformRect前述の方法を使用して、新しい rect ( ) をクリック可能としてマークします。
  • 現在のコンテキストを保存して、後で行われること (色、サイズ、属性など) が現在のコンテキストに永続的に残らないようにする
  • 提供された四角形にテキストを描画します(現在はUIKit座標系を使用しています)
  • コンテキスト GState を復元する
于 2013-02-07T11:13:35.350 に答える