2016-10-20 3 views
2

Я хочу, чтобы нарисовать приписываемую строку с отсечением прямоугольника, и я нашел функцию написанную в Objective-C,Как использовать CFDictionaryCreate в 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; 
} 

Но я не смог перевести его в Swift 3, кто-нибудь могут мне помочь?

// Я попытался belowing коды, компилирует и бежать, но текст не делает клип:

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) 

ответ

0

Построить Swift словарь и затем бросить его CFDictionary. Пример:

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 

Подробнее здесь: https://bugs.swift.org/browse/SR-2388

Смежные вопросы