ios - 如何在 Swift 2.0 中创建 CTRunDelegate

标签 ios swift core-text

我正在使用 CoreText 来处理 NSTextAttachment。 CoreText 需要 CTRunDelegate 来布局附件。但运行以下代码时出现错误。

class RunDelegate: NSObject {
    let image: UIImage
    let font: UIFont

    init(image: UIImage, font: UIFont) {
        self.image = image
        self.font = font
    }
}

private func generateRunDelegate(attachment: NSTextAttachment, font: UIFont) -> CTRunDelegateRef {
    var d = RunDelegate(image: attachment.image!, font: font)
    var cbs = CTRunDelegateCallbacks(version: kCTRunDelegateCurrentVersion, dealloc: { (p) -> Void in

        }, getAscent: { (p) -> CGFloat in
            let d = UnsafeMutablePointer<RunDelegate>(p).memory
            return d.image.size.height + d.font.descender // Error here, EXC_BAD_ACCESS(code = 1)
        }, getDescent: { (p) -> CGFloat in
            let d = UnsafeMutablePointer<RunDelegate>(p).memory
            return -d.font.descender
        }) { (p) -> CGFloat in
            let d = UnsafeMutablePointer<RunDelegate>(p).memory
            return d.image.size.width
    }
    return CTRunDelegateCreate(&cbs, &d)!
}

有人可以帮忙吗?谢谢!

最佳答案

请尝试此代码。

class RunDelegate: NSObject {
    let image: UIImage
    let font: UIFont

    class func object(pointer: UnsafeMutablePointer<Void>) -> RunDelegate {
        return Unmanaged<RunDelegate>.fromOpaque(COpaquePointer(pointer)).takeRetainedValue()
    }

    init(image: UIImage, font: UIFont) {
        self.image = image
        self.font = font
    }
}

private func generateRunDelegate(attachment: NSTextAttachment, font: UIFont) -> CTRunDelegateRef {
    var d = RunDelegate(image: attachment.image!, font: font)
    var cbs = CTRunDelegateCallbacks(version: kCTRunDelegateCurrentVersion,
           dealloc: { (p) -> Void in

        }, getAscent: { (p) -> CGFloat in
            let d = RunDelegate.object(pointer: p)
            return d.image.size.height + d.font.descender
        }, getDescent: { (p) -> CGFloat in
            let d = RunDelegate.object(pointer: p)
            return -d.font.descender
        }) { (p) -> CGFloat in
            let d = RunDelegate.object(pointer: p)
            return d.image.size.width
    }
    return CTRunDelegateCreate(&cbs, d)!
}

我认为它没有正确生成UnsafePointer。

关于ios - 如何在 Swift 2.0 中创建 CTRunDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33997481/

相关文章:

窗口不旋转的iOS subview

swift - 如何在 Mac 上写入照片库?

ios - 从 View Controller 动态加载 tabItems 时,TabBar 未显示 [更多...] 图标

iphone - Core Text - 在 iPhone 中选择文本?

ios - 在合并的 PDF 中添加页码

ios - 如何移动核心数据中的行 - 使用Faulting教程 - IOS

ios - 在 Flutter 上隐藏 iOS 状态栏

ios - Swift - UIAlertController 后操作

ios - 如何计算 UILabel 的高度?

ios - 在 swift 4 中添加带计时器的导航栏刷新按钮