Мне нужно все Apple Emojis.
Я могу получить все emojis и поместить их в String, скопировав их с сайта getemoji но в моем приложении мне нужен emojis в правильном порядке как изображения.
Есть ли хороший способ конвертировать emojis, который я копирую в String, в UIImage?
Или лучшее решение для того, чтобы получить все эмуляторы Apple в правильном порядке?
Преобразование Apple Emoji (String) в UIImage
Ответ 1
Обновлено для Swift 4.1
Добавьте это расширение в ваш проект
import UIKit
extension String {
func image() -> UIImage? {
let size = CGSize(width: 40, height: 40)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
UIColor.white.set()
let rect = CGRect(origin: .zero, size: size)
UIRectFill(CGRect(origin: .zero, size: size))
(self as AnyObject).draw(in: rect, withAttributes: [.font: UIFont.systemFont(ofSize: 40)])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Приведенный выше код рисует текущую String
в контексте изображения с белым фоновым цветом и, наконец, преобразует его в UIImage
.
Теперь вы можете написать
пример
Приведен список диапазонов, указывающих Unicode-значения символов Emoji
let ranges = [0x1F601...0x1F64F, 0x2702...0x27B0]
Вы можете превратить его в список изображений
let images = ranges
.flatMap { $0 }
.compactMap { Unicode.Scalar($0) }
.map(Character.init)
.compactMap { String($0).image() }
Результат:
Я не могу гарантировать, что список диапазонов полон, вам нужно искать его самостоятельно 😉
Ответ 2
То же самое для Swift 4:
extension String {
func emojiToImage() -> UIImage? {
let size = CGSize(width: 30, height: 35)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
UIColor.white.set()
let rect = CGRect(origin: CGPoint(), size: size)
UIRectFill(rect)
(self as NSString).draw(in: rect, withAttributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 30)])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Ответ 3
Обновленный ответ @Luca Angeletti для Swift 3.0.1
extension String {
func image() -> UIImage? {
let size = CGSize(width: 30, height: 35)
UIGraphicsBeginImageContextWithOptions(size, false, 0);
UIColor.white.set()
let rect = CGRect(origin: CGPoint(), size: size)
UIRectFill(CGRect(origin: CGPoint(), size: size))
(self as NSString).draw(in: rect, withAttributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 30)])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Ответ 4
Swift 4.2
Мне очень понравилось решение @Luca Angeletti. У меня такой же вопрос, как у @jonauz, о прозрачном фоне. Так что с этой небольшой модификацией вы получите то же самое, но с чистым цветом фона.
У меня не было представителя, чтобы ответить в комментарии.
import UIKit
extension String {
func emojiToImage() -> UIImage? {
let size = CGSize(width: 30, height: 35)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
UIColor.clear.set()
let rect = CGRect(origin: CGPoint(), size: size)
UIRectFill(CGRect(origin: CGPoint(), size: size))
(self as NSString).draw(in: rect, withAttributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 30)])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Ответ 5
Здесь обновленный ответ со следующими изменениями:
- По центру: использовал
draw(at:withAttributes:)
вместоdraw(in:withAttributes:)
для центрирования текста в результирующем UIImage - Правильный размер: Используемый
size(withAttributes:)
для получения результирующего UIImage размера, который соответствует фактическому размеру шрифта. - Комментарии: Добавлены комментарии для лучшего понимания
- Swift Version 3.2
import UIKit
extension String {
func textToImage() -> UIImage? {
let nsString = (self as NSString)
let font = UIFont.systemFont(ofSize: 1024) // you can change your font size here
let stringAttributes = [NSFontAttributeName: font]
let imageSize = nsString.size(attributes: stringAttributes)
UIGraphicsBeginImageContextWithOptions(imageSize, false, 0) // begin image context
UIColor.clear.set() // clear background
UIRectFill(CGRect(origin: CGPoint(), size: imageSize)) // set rect size
nsString.draw(at: CGPoint.zero, withAttributes: stringAttributes) // draw text within rect
let image = UIGraphicsGetImageFromCurrentImageContext() // create image from context
UIGraphicsEndImageContext() // end image context
return image ?? UIImage()
}
}
Ответ 6
Обновленная версия ответа UIGraphicsImageRenderer
с использованием UIGraphicsImageRenderer
:
extension String {
func image() -> UIImage? {
let size = CGSize(width: 100, height: 100)
let rect = CGRect(origin: CGPoint(), size: size)
return UIGraphicsImageRenderer(size: size).image { (context) in
(self as NSString).draw(in: rect, withAttributes: [.font : UIFont.systemFont(ofSize: 100)])
}
}
}