UILabelをUIImageに変換していい感じに拡大縮小する

はじめに

UILabelのフォントサイズを変更して拡大縮小を行おうとする、と文字が小さくなるにつれて下にずれてしまいます。
そんな時はUILabelに変換して画像として表示を行うとサイズが変わっても文字の位置が変わらずいい感じになります。

動画

コード

UIViewの中にUIImageを配置しているので直接UIImageの大きさをいじらなくてもUIViewの大きさを変えるだけでサイズ変更されます。

class ViewController: UIViewController {

    @IBOutlet weak var v: UIView!
    @IBOutlet weak var textImage: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textImage.image = createImage()
    }
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        let pos = touches.first!.location(in: self.view)
        
        let transScale = CGAffineTransform(scaleX: CGFloat(pos.x)/100, y: CGFloat(pos.x)/100)
        v.transform = transScale
    }

    func createImage() -> UIImage{
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
        label.font = UIFont.systemFont(ofSize: 40)
        label.textColor = .white
        label.text = 1.description
        label.textAlignment = .center
        return  UIImage.imageWithLabel(label: label)
    }
}
extension UIImage {
    class func imageWithLabel(label: UILabel) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0)
        label.layer.render(in: UIGraphicsGetCurrentContext()!)
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img!
    }
}

参考文献

How to create an image from UILabel?

Swift

次の記事

LottieをIBから使う