J'ai besoin de tous les Apple Emojis.
Je peux obtenir tous les emojis et les mettre dans une String en les copiant depuis le site getemoji mais dans mon application j'ai besoin des emojis dans le bon ordre sous forme d'images .
Existe-t-il un bon moyen de convertir les emojis que je copie en une chaîne en un UIImage?
Ou une meilleure solution pour obtenir tous les Apple emojis dans le bon ordre?
Ajoutez cette extension à votre projet
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
}
}
Le code ci-dessus dessine le String
actuel dans un contexte d'image avec une couleur de fond blanc et le transforme finalement en UIImage
.
Vous pouvez maintenant écrire
Étant donné une liste de plages indiquant les valeurs unicode des symboles emoji
let ranges = [0x1F601...0x1F64F, 0x2702...0x27B0]
vous pouvez le transformer en une liste d'images
let images = ranges
.flatMap { $0 }
.compactMap { Unicode.Scalar($0) }
.map(Character.init)
.compactMap { String($0).image() }
Résultat:
Je ne peux pas garantir que la liste des gammes est complète, vous devrez la rechercher par vous-même ????
Même chose pour 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
}
}
Mise à jour @ Luca Angeletti réponse pour 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
}
}
J'ai vraiment aimé la solution @Luca Angeletti. Je hade la même question que @jonauz sur le fond transparent. Donc, avec cette petite modification, vous obtenez la même chose mais avec une couleur d'arrière-plan claire.
Je n'ai pas eu le représentant pour répondre dans un commentaire.
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
}
}
Voici une réponse mise à jour avec les modifications suivantes:
draw(at:withAttributes:)
au lieu de draw(in:withAttributes:)
= pour centrer le texte dans l'image UII résultantesize(withAttributes:)
pour avoir un UIImage de taille résultant qui correspond à la taille réelle de la police.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()
}
}
Version mise à jour de la réponse de @Luca Angeletti en utilisant 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)])
}
}
}