UILabel から UIImage を作る方法
先日、絵文字をみていたのですが、案外拡大してみると面白いです。
拡大してみると、こんな風にかなり詳細も描かれています。
さらに、新聞にはご丁寧に Apple Times と書かれていたり、 F1 マシンの横には Swift のロゴ (が反対向きに) 描かれていたりします。
さて、こんな絵文字ですが、 Unicode の文字ということでラベル (UILabel) に表示できます。
これを画像として扱うには、UIImage に変換する必要があります。
UILabel の表示内容を UIImage に変換するには次のコードが使えます。
import UIKit
func getImage(from label:UILabel) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0)
defer{
UIGraphicsEndImageContext()
}
label.drawHierarchy(in: label.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
return image
}
この関数に UILabel を渡すと、変換可能な時に UIImage を返します。nil を返す場合もあるので、戻り値は UIImage? です。
ついでに、これを使う側のコードを示しておきます。
ここでは getImage の戻り値をアンラップしてから、その画像データをシェアするので UIActivityViewController に渡して表示しています。
guard let image = getImage(from: emojiLabel) else {
return
}
let activity = UIActivityViewController(
activityItems: [image],
applicationActivities: nil)
activity.popoverPresentationController?.sourceView = self.view
self.present(activity, animated: true, completion: nil)
ちなみに popoverPresentationController のソースビュー指定は iPad 向けの時に必要になります。いつも書くようにしておいた方が無難でしょう。