作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想在 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 is not convertible to '@lvalue inout $T3'
您有什么线索可以解决这两个错误吗?
最佳答案
CFData
与 NSData
和 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)
关于 swift CGPDFContextBeginPage 和 CFData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29041803/
我想在 Swift 中创建一些 PDF 页面。 这是我创建 PDF 页面的代码 // Initialize context and other stuff CGPDFContextBeginPage(
我是一名优秀的程序员,十分优秀!