Ruby中的文字/ Furigana

时间:2014-09-23 11:34:15

标签: ios core-text ruby-characters

我目前正试图在UITextView上以日语显示一些文字。 是否有可能以类似于<的方式显示汉字上方的假名(如下所示)。室温> html中的标签,不使用网页视图?

enter image description here

涉及大量文本处理,因此我不能简单地使用Web视图。在iOS8中,添加了CTRubyAnnotationRef但没有文档(我会欢迎任何示例),而且我也担心与iOS7缺乏兼容性。我认为可以使用NSAttributedString显示上面的假名,但到目前为止还没有。

2 个答案:

答案 0 :(得分:1)

最后,我创建了一个能够获得汉字位置的函数,并且每次都会在汉字上方创建标签。它非常脏,但它是确保与iOS7兼容的唯一方法。

但是我必须提到你现在可以在GitHub上为CTRubyAnnotationRef找到的非凡的例子:http://dev.classmethod.jp/references/ios8-ctrubyannotationref/https://github.com/shinjukunian/SimpleFurigana

祝大家好运!

答案 1 :(得分:0)

我找到了一个很好的解决方案

Swift 4.2

此解决方案是对预览答案的更新,可以让您编写日语句子,并使用一种模式可以显示带有假名的句子。

在此解决方案中,您使用3个String扩展名

func find(pattern: String) -> NSTextCheckingResult? {
do {
    let findRubyText = try NSRegularExpression(pattern: pattern, options: [])
    return findRubyText.firstMatch(
        in: self,
        options: [],
        range: NSMakeRange(0, self.utf16.count))
} catch {
    return nil
}
}

func replace(pattern: String, template: String) -> String {
do {
    let replaceRubyText = try NSRegularExpression(pattern: pattern, options: [])
    return replaceRubyText.stringByReplacingMatches(
        in: self,
        options: [],
        range: NSMakeRange(0, self.utf16.count),
        withTemplate: template)
} catch {
    return self
}
}

func rubyAttributedString(font: UIFont, textColor: UIColor) -> NSMutableAttributedString {
let attributed =
    self.replace(pattern: "(|.+?《.+?》)", template: ",$1,")
        .components(separatedBy: ",")
        .map { x -> NSAttributedString in
            if let pair = x.find(pattern: "|(.+?)《(.+?)》") {
                let baseText = (x as NSString).substring(with: pair.range(at: 1))
                let ruby = (x as NSString).substring(with: pair.range(at: 2))

                let rubyAttribute: [AnyHashable: Any] = [
                    kCTRubyAnnotationSizeFactorAttributeName: 0.5,
                    kCTForegroundColorAttributeName: textColor
                ]

                let annotation = CTRubyAnnotationCreateWithAttributes(.auto, .auto, .before, ruby as CFString, rubyAttribute as CFDictionary)

                return NSAttributedString(
                    string: baseText,
                    attributes: [.font: font,
                                 .foregroundColor: textColor,
                                 kCTRubyAnnotationAttributeName as NSAttributedString.Key: annotation])

            } else {
                return NSAttributedString(
                    string: x,
                    attributes: [.font: font,
                                 .foregroundColor: textColor]
                )
            }
        }
        .reduce(NSMutableAttributedString()) { $0.append($1); return $0     }

return attributed
}

此扩展允许您创建一个NSAttributed字符串以提供给标签

Great solution written in Japanese but it possible to download the example project