Ответ 1
Уточнение: Emoji - это просто символ в пространстве символов Unicode, поэтому настоящее решение работает для всех символов, а не только для Emoji.
Описание
Чтобы узнать, доступен ли символ Unicode (включая Emoji) на данном устройстве или ОС, запустите метод unicodeAvailable()
ниже.
Он работает путем сравнения заданного символьного изображения с известным символом undefined 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
}
Обсуждение
-
Все символы будут отображаться как png с одинаковым размером (8), как определено в
static let refUnicodeSize: CGFloat = 8
-
Изображение undefined character
U+1FFF
рассчитывается один раз вstatic let refUnicodePng = Character("\u{1fff}").png(ofSize: Character.refUnicodeSize)
-
Вспомогательный метод необязательно создает png из
Character
func png(ofSize fontSize: CGFloat) -> Data?
1. Пример: тест против 3 emoji
let codes:[Character] = ["\u{2764}","\u{1f600}","\u{1F544}"] // ❤️, 😀, undefined
for unicode in codes {
print("\(unicode) : \(unicode.unicodeAvailable())")
}
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")
}
}
}
Вспомогательная функция: Character
до png
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
}
► Найдите это решение на GitHub и детальную статью о Быстрые рецепты.