2015-03-13 3 views
2

Je voudrais créer des pages PDF dans Swift.Swift CGPDFContextBeginPage et CFData

Ceci est mon code pour créer une page PDF

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

J'ai un problème avec la variable "aDictionary". Je voudrais ajouter la valeur media box (qui est la variable de type CGRect) sous la clé kCGPDFContextMediaBox. La documentation me dit ce qui suit: 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).

Dans l'objectif-c, il est assez facile de créer un CFData à partir de CGRect, mais dans Swift je ne sais pas comment le créer. Voici mon objectif-c code:

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

Quelle devrait être la variante Swift?

Supposons que j'ai créé un objet CFData, l'étape "difficile" suivante consiste à l'ajouter à un CFDictionary. Voici comment j'ai essayé:

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

Pour ces deux lignes, je reçois l'erreur suivante: CFString is not convertible to '@lvalue inout $T3'

Avez-vous des indices comment puis-je corriger ces deux erreurs?

Répondre

3

CFData est « ponté sans frais » avec NSData et CFDictionary avec NSDictionary. Donc, ce qui suit devrait fonctionner:

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) 

Mise à jour pour 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) 
+1

de Nice! Le 'sizeofValue' a sauvé ma journée. J'ai essayé avec juste sizeof et cela ne fonctionnait pas. –

+0

@InfinitePossibilities: Oui, contrairement à C, Swift fait une distinction entre 'sizeof (someType)' et 'sizeofValue (someValue)'. –

+0

Merci @ Martin R, je dois lire les docs à ce sujet. –