Swift CGPDFContextBeginPage 和 CFData

Inf*_*ies 2 core-foundation cfdata swift cfdictionary

我想用 Swift 创建一些 PDF 页面。

这是我创建 PDF 页面的代码

// Initialize context and other stuff
CGPDFContextBeginPage(pdfContext, aDictionary);
CGContextDrawPDFPage(pdfContext, pdfPageRef)
CGPDFContextEndPage(pdfContext)
Run Code Online (Sandbox Code Playgroud)

我对“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 中我不知道如何创建它。这是我的 Objective-C 代码:

CGRect mediaBox = CGRectZero;
CFDataCreate(kCFAllocatorDefault, (const UInt8 *)&mediaBox, sizeof(mediaBox));
Run Code Online (Sandbox Code Playgroud)

Swift 变体应该是什么?

假设我以某种方式创建了一个 CFData 对象,下一个“困难”步骤是将其添加到 CFDictionary 中。这是我尝试过的方法:

let pageDictionary = CFDictionaryCreateMutable(nil, 0, nil, nil);
CFDictionarySetValue(pageDictionary, key: &kCGPDFContextMediaBox, value: data);
Run Code Online (Sandbox Code Playgroud)

对于这两行,我收到以下错误:CFString is not convertible to '@lvalue inout $T3'

您有任何线索我该如何解决这两个错误吗?

Mar*_*n R 5

CFData是 \xe2\x80\x9ctoll-free 桥接 \xe2\x80\x9d 与NSData, 和CFDictionary\n与NSDictionary。所以以下应该有效:

\n\n
var mediaBox = CGRect(x: 0.0, y: 0.0, width: 612, height: 792)\nlet boxData = NSData(bytes: &mediaBox, length: sizeofValue(mediaBox))\nlet pageInfo = [ kCGPDFContextMediaBox as String : boxData ]\nCGPDFContextBeginPage(context, pageInfo)\n
Run Code Online (Sandbox Code Playgroud)\n\n

Swift 3更新

\n\n
var mediaBox = CGRect(x: 0.0, y: 0.0, width: 612, height: 792)\nlet boxData = NSData(bytes: &mediaBox, length: MemoryLayout.size(ofValue: mediaBox))\nlet pageInfo = [ kCGPDFContextMediaBox as String : boxData ]\ncontext.beginPDFPage(pageInfo as NSDictionary)\n
Run Code Online (Sandbox Code Playgroud)\n