Swift CGPDFContextBeginPage 和 CFData

标签 swift core-foundation cfdata cfdictionary

我想在 Swift 中创建一些 PDF 页面。

这是我创建 PDF 页面的代码

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

我对“aDictionary”变量有疑问。我想在 kCGPDFContextMediaBox 键下添加媒体框(CGRect 类型变量)值。该文档告诉我以下内容: 文档或给定页面的媒体框。该键是可选的。如果存在,则此键的值必须是包含 CGRect 的 CFData 对象(按值存储,而不是按引用存储)。

在 Objective-C 中,从 CGRect 创建 CFData 相当容易,但在 Swift 中我不知道如何创建它。这是我的 Objective-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);

对于这两行,我收到以下错误:CFString 无法转换为 '@lvalue inout $T3'

您知道如何修复这两个错误吗?

最佳答案

CFDataNSDataCFDictionary 进行“免费桥接” 与 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)

关于Swift CGPDFContextBeginPage 和 CFData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29041803/

相关文章:

php - 如何在 Swift 的 post 请求中找到另一种使用 "&"的方法

ios - 从 Swift 在 iOS 上生成 UUID

ios - 使用 Mobile-Iron : required CoreFoundation property is missing 的内部应用程序分发错误

objective-c - ABRecordSetValue 返回的 CFErrorRef 的内存管理

ios - EXC_BAD_ACCESS 在 iOS 6 上,但在更改 CFDataRef 的字节时不是 5

objective-c - Swift 相当于@encode

ios - Swift 4 SpriteKit 检测联系人

ios - Swift 字符串插值打印之间的区别

ios - CGDataProviderCopyData 在内存中累积导致崩溃

iphone - 从 PDF 中提取图像