有没有办法知道iOS中是否支持表情符号?

Dav*_*vid 20 ios emoji

我正在构建一个iOS应用程序,而Emojis在其中发挥了重要作用.

在iOS 10.2中,发布了新的表情符号.

我很确定,如果有人拥有iOS 8,他们实际上无法看到这些表情符号.有没有办法检测到这个?我正在尝试动态构建用户iOS版本支持的所有Emojis列表,但我遇到了一些麻烦.

Swi*_*ect 23

澄清:表情符号只是Unicode字符空间中的一个字符,因此本解决方案适用于所有字符,而不仅仅是表情符号.

概要

要了解给定设备或操作系统上是否有Unicode字符(包括表情符号),请运行以下unicodeAvailable()方法.

它的工作原理是将给定的字符图像与已知的未定义的Unicode字符进行比较U+1FFF.

unicodeAvailable(),一个Character扩展名

private static let refUnicodeSize: CGFloat = 8
private static let refUnicodePng =
    Character("\u{1fff}").png(ofSize: Character.refUnicodeSize)

func unicodeAvailable() -> Bool {
    if let refUnicodePng = Character.refUnicodePng,
        let myPng = self.png(ofSize: Character.refUnicodeSize) {
        return refUnicodePng != myPng
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)

讨论

  1. 所有字符将呈现为与一次定义的相同大小(8)的png

    static let refUnicodeSize: CGFloat = 8

  2. 未定义的字符U+1FFF图像计算一次

    static let refUnicodePng = Character("\u{1fff}").png(ofSize: Character.refUnicodeSize)

  3. 辅助方法可以选择从a 创建一个pngCharacter

    func png(ofSize fontSize: CGFloat) -> Data?

1.示例:针对3个表情符号进行测试

let codes:[Character] = ["\u{2764}","\u{1f600}","\u{1F544}"] // ??, , undefined
for unicode in codes {
    print("\(unicode) : \(unicode.unicodeAvailable())")
}
Run Code Online (Sandbox Code Playgroud)

3个字符

2.示例:测试一系列Unicode字符

func unicodeRange(from: Int, to: Int) {
    for unicodeNumeric in from...to {
        if let scalar = UnicodeScalar(unicodeNumeric) {
            let unicode = Character(scalar)
            let avail = unicode.unicodeAvailable()
            let hex = String(format: "0x%x", unicodeNumeric)
            print("\(unicode) \(hex) is \(avail ? "" : "not ")available")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

几百个字符


助手功能:Characterpng

func png(ofSize fontSize: CGFloat) -> Data? {
    let attributes = [NSAttributedStringKey.font:
                          UIFont.systemFont(ofSize: fontSize)]
    let charStr = "\(self)" as NSString
    let size = charStr.size(withAttributes: attributes)

    UIGraphicsBeginImageContext(size)
    charStr.draw(at: CGPoint(x: 0,y :0), withAttributes: attributes)

    var png:Data? = nil
    if let charImage = UIGraphicsGetImageFromCurrentImageContext() {
        png = UIImagePNGRepresentation(charImage)
    }

    UIGraphicsEndImageContext()
    return png
}
Run Code Online (Sandbox Code Playgroud)

►在GitHub上找到这个解决方案和一个关于Swift Recipes的详细文章.

  • 它只是尚未实现(或定义)的众多字符之一.因此,它会打印一个[?]问号,所有无效字符也是如此.所有无效的unicode字符共享相同的位图. (3认同)