我正在开发一个iOS应用,其中表情符号在其中扮演着重要的角色。
我很确定,例如如果有人使用的是iOS 8,他们实际上将无法看到这些表情符号。是否有方法来检测这个问题?我正在尝试动态构建所有受用户iOS版本支持的表情符号列表,但是我遇到了一些麻烦。
我正在开发一个iOS应用,其中表情符号在其中扮演着重要的角色。
我很确定,例如如果有人使用的是iOS 8,他们实际上将无法看到这些表情符号。是否有方法来检测这个问题?我正在尝试动态构建所有受用户iOS版本支持的表情符号列表,但是我遇到了一些麻烦。
澄清:表情符号只是Unicode字符空间中的一个字符,因此现有解决方案适用于所有字符,而不仅仅是表情符号。
要知道一个Unicode字符(包括表情符号)是否在给定的设备或操作系统上可用,请运行下面的unicodeAvailable()
方法。
它通过将给定的字符图像与已知未定义的Unicode字符U+1FFF
进行比较来实现。
Character
扩展:unicodeAvailable()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
}
所有字符都将被渲染为 png,大小与以下定义一致:
static let refUnicodeSize: CGFloat = 8
未定义的字符U+1FFF
图像会在以下代码中计算一次:
static let refUnicodePng = Character("\u{1fff}").png(ofSize: Character.refUnicodeSize)
一个辅助方法可以从Character
可选地创建一个png:
func png(ofSize fontSize: CGFloat) -> Data?
let codes:[Character] = ["\u{2764}","\u{1f600}","\u{1F544}"] // ❤️, , undefined
for unicode in codes {
print("\(unicode) : \(unicode.unicodeAvailable())")
}
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")
}
}
}
Character
转 pngfunc 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
}
► 您可以在 GitHub 上找到此解决方案,并在 Swift Recipes 上阅读详细介绍。
Character
,如 \u{1F1EA}\u{1F1EA}
,你将得到 ,并且单元测试 请参见 GitHub 项目 将通过。 - SwiftArchitectUIGraphicsBeginImageContext
的合适等效项。您介意也分享一下macOS的解决方案吗? - ixany