2016-10-20 3 views
2

Je veux dessiner une chaîne attribuée à clipping rect, et j'ai trouvé une fonction écrite en Objective-C,Comment utiliser CFDictionaryCreate dans Swift 3?

CFDictionaryRef PINCHFrameAttributesCreateWithClippingRect(CGRect clippingRect, CGAffineTransform transform) 
{ 
    CGPathRef clipPath = CGPathCreateWithRect(clippingRect, &transform); 

    CFDictionaryRef options; 

    CFStringRef keys[] = {kCTFramePathClippingPathAttributeName}; 
    CFTypeRef values[] = {clipPath}; 
    CFDictionaryRef clippingPathDict = CFDictionaryCreate(NULL, 
                  (const void **)&keys, (const void **)&values, 
                  sizeof(keys)/sizeof(keys[0]), 
                  &kCFTypeDictionaryKeyCallBacks, 
                  &kCFTypeDictionaryValueCallBacks); 

    CFTypeRef clippingArrayValues[] = { clippingPathDict }; 
    CFArrayRef clippingPaths = CFArrayCreate(NULL, (const void **)clippingArrayValues, sizeof(clippingArrayValues)/sizeof(clippingArrayValues[0]), &kCFTypeArrayCallBacks); 

    CFStringRef optionsKeys[] = {kCTFrameClippingPathsAttributeName}; 
    CFTypeRef optionsValues[] = {clippingPaths}; 
    options = CFDictionaryCreate(NULL, (const void **)&optionsKeys, (const void **)&optionsValues, 
           sizeof(optionsKeys)/sizeof(optionsKeys[0]), 
           &kCFTypeDictionaryKeyCallBacks, 
           &kCFTypeDictionaryValueCallBacks); 

    CFRelease(clippingPathDict); 
    CFRelease(clippingPaths); 
    CGPathRelease(clipPath); 

    return options; 
} 

Mais j'omettent de traduire dans Swift 3, quelqu'un peut me aider?

// J'ai essayé codes belowing, il compile et exécuté, mais le texte ne fait pas clip:

let keys: [CFString] = [kCTFrameClippingPathsAttributeName] 
    let values: [CFTypeRef] = [clipPath] 

    let keysPointer = UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: keys.count) 
    keysPointer.initialize(to: keys) 

    let valuesPointer = UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: values.count) 
    valuesPointer.initialize(to: values) 

    let options = CFDictionaryCreate(kCFAllocatorDefault, keysPointer, valuesPointer, 1, nil, nil) 

    let framesetter = CTFramesetterCreateWithAttributedString(attributedSring) 
    let frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attributedSring.length), rectPath.cgPath, options) 
    CTFrameDraw(frame, context) 

Répondre

0

Construct un dictionnaire Swift puis jeté à CFDictionary. Exemple:

let d = [ 
     kCGImageSourceShouldAllowFloat as String : true as NSNumber, 
     kCGImageSourceCreateThumbnailWithTransform as String : true as NSNumber, 
     kCGImageSourceCreateThumbnailFromImageAlways as String : true as NSNumber, 
     kCGImageSourceThumbnailMaxPixelSize as String : w as NSNumber 
    ] as CFDictionary 

Plus de détails ici: https://bugs.swift.org/browse/SR-2388