作者:wqgysxy | 来源:互联网 | 2022-11-29 10:33
我希望能够在Swift中获得所有可用emojis的数组.我所说的是所有当前可以访问设备的.就像Apple添加了一些新的表情符号一样,我希望不必更改任何代码,而新的表情符号只是添加到数组中与其他所有表情符号一起添加.
如果无法获得更新的表情符号,那么如何将所有当前表情符号放入一个数组(或者可能是一个.plist文件,然后我可以加载到一个数组中),这样我就可以在代码中访问它们了?
1> 小智..:
这个SO似乎提供了答案
如何在不使用任何形式的查找表的情况下在iOS 8中列出(几乎)所有表情符号?
for i in 0x1F601...0x1F64F {
let c = String(UnicodeScalar(i) ?? "-")
print(c)
}
你应该超越1F64F,
找出字符串中的字符是否是表情符号?
0x1F600...0x1F64F, // Emoticons
8400...8447: // Combining Diacritical Marks for Symbols
9100...9300, // Misc items
0x2600...0x26FF, // Misc symbols
0x2700...0x27BF, // Dingbats
0xFE00...0xFE0F, // Variation Selectors
0x1F018...0x1F270, // Various asian characters
0x1F300...0x1F5FF, // Misc Symbols and Pictographs
0x1F680...0x1F6FF, // Transport and Map
0x1F1E6...0x1F1FF, // Regional country flags
0x1F900...0x1F9FF, // Supplemental Symbols and Pictographs
65024...65039, // Variation selector
但是,你得到一些未定义的(在范围的末尾标记为?)请参阅此处跳过它们
有没有办法知道iOS中是否支持表情符号?
请注意,在搜索时,根据国家/地区代码www.timekl.com/blog/2017/08/31/swift-tricks-emoji-flags/找到了生成表情符号标记的有趣链接
最终得到以下代码
func isEmoji(_ value: Int) -> Bool {
switch value {
case 0x1F600...0x1F64F, // Emoticons
0x1F300...0x1F5FF, // Misc Symbols and Pictographs
0x1F680...0x1F6FF, // Transport and Map
0x1F1E6...0x1F1FF, // Regional country flags
0x2600...0x26FF, // Misc symbols 9728 - 9983
0x2700...0x27BF, // Dingbats
0xFE00...0xFE0F, // Variation Selectors
0x1F900...0x1F9FF, // Supplemental Symbols and Pictographs 129280 - 129535
0x1F018...0x1F270, // Various asian characters 127000...127600
65024...65039, // Variation selector
9100...9300, // Misc items
8400...8447: // Combining Diacritical Marks for Symbols
return true
default: return false
}
}
extension Character {
private static let refUnicodeSize: CGFloat = 8
private static let refUnicodePng =
Character("\u{1fff}").png(ofSize: Character.refUnicodeSize)
func png(ofSize fontSize: CGFloat) -> Data? {
let attributes = [NSAttributedString.Key.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 = charImage.pngData()
}
UIGraphicsEndImageContext()
return png
}
func unicodeAvailable() -> Bool {
if let refUnicodePng = Character.refUnicodePng,
let myPng = self.png(ofSize: Character.refUnicodeSize) {
return refUnicodePng != myPng
}
return false
}
}
for i in 8400...0x1F9FF where isEmoji(i) {
if let scalar = UnicodeScalar(i) {
let unicode = Character(scalar)
if unicode.unicodeAvailable() {
print(i, String(scalar))
count += 1
} else {
notAvail += 1
print(i)
}
} else {
notCounted += 1
}
}
print("Count", count, "Not counted", notCounted, "Not Avail", notAvail)