Swift CGPDFContextBeginPage и CFData

Я хотел бы создать несколько страниц PDF в Swift.

Это мой код для создания страницы PDF

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

У меня проблема с переменной "aDictionary". Я хотел бы добавить значение media box (которое является переменной типа CGRect) под ключом kCGPDFContextMediaBox. Документация говорит мне следующее: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).

В target-c довольно легко создать CFData из CGRect, но в 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);

Для этих двух строк я получаю следующую ошибку: CFString is not convertible to '@lvalue inout $T3'

У вас есть какие-либо подсказки, как я могу исправить эти две ошибки?

1 ответ

Решение

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)
Другие вопросы по тегам