2

Swift でいくつかの PDF ページを作成したいと思います。

これは、PDFページを作成するための私のコードです

// Initialize context and other stuff
CGPDFContextBeginPage(pdfContext, aDictionary);
CGContextDrawPDFPage(pdfContext, pdfPageRef)
CGPDFContextEndPage(pdfContext)

「aDictionary」変数に問題があります。kCGPDFContextMediaBox キーの下にメディア ボックス (CGRect 型の変数) の値を追加したいと思います。ドキュメントには次のことが記載されています。 The media box for the document or for a given page. This key is optional. If present, the value of this key must be a CFData object that contains a CGRect (stored by value, not by reference).

Objective-C では、CGRect から CFData を作成するのはかなり簡単ですが、Swift では作成方法がわかりません。ここに私の目的のCコードがあります:

CGRect mediaBox = CGRectZero;
CFDataCreate(kCFAllocatorDefault, (const UInt8 *)&mediaBox, sizeof(mediaBox));

Swift バリアントとは何ですか?

どういうわけか CFData オブジェクトを作成したとしましょう。次の「難しい」ステップは、これを CFDictionary に追加することです。これが私が試した方法です:

let pageDictionary = CFDictionaryCreateMutable(nil, 0, nil, nil);
CFDictionarySetValue(pageDictionary, key: &kCGPDFContextMediaBox, value: data);

これらの 2 行で、次のエラーが表示されます。CFString is not convertible to '@lvalue inout $T3'

これら2つのエラーを修正するにはどうすればよいですか?

4

1 に答える 1

4

CFDataNSDataは、 、およびCFDictionary と「無料でブリッジ」されていNSDictionaryます。したがって、次のように動作するはずです。

var mediaBox = CGRect(x: 0.0, y: 0.0, width: 612, height: 792)
let boxData = NSData(bytes: &mediaBox, length: sizeofValue(mediaBox))
let pageInfo = [ kCGPDFContextMediaBox as String : boxData ]
CGPDFContextBeginPage(context, pageInfo)

Swift 3の更新:

var mediaBox = CGRect(x: 0.0, y: 0.0, width: 612, height: 792)
let boxData = NSData(bytes: &mediaBox, length: MemoryLayout.size(ofValue: mediaBox))
let pageInfo = [ kCGPDFContextMediaBox as String : boxData ]
context.beginPDFPage(pageInfo as NSDictionary)
于 2015-03-13T21:15:20.197 に答える