2016-10-20 13 views
2

내가하는 구형을 클리핑을 가진 기인 문자열을 그리려는, 내가 목표 - C로 작성된 기능을 발견,Swift 3에서 CFDictionaryCreate를 사용하는 방법?

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; 
} 

하지만 스위프트 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

는 스위프트 사전을 구축하고 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