【问题标题】:How to use CFDictionaryCreate in Swift 3?如何在 Swift 3 中使用 CFDictionaryCreate?
【发布时间】:2016-10-20 06:12:22
【问题描述】:

我想画一个带有裁剪矩形的属性字符串,我找到了一个用Objective-C写的函数,

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 中翻译失败,有人可以帮助我吗?

// 我尝试了以下代码,它编译并运行,但文本不做剪辑:

    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)

【问题讨论】:

    标签: core-graphics swift3 cgcontext core-foundation


    【解决方案1】:

    构造一个 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

    【讨论】:

      猜你喜欢
      • 2017-10-27
      • 2017-02-17
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多