Pertanyaan Bagaimana cara membuat gambar dari UILabel?


Saat ini saya mengembangkan photoshop sederhana seperti aplikasi di iphone. Ketika saya ingin meratakan lapisan saya, label berada pada posisi yang baik tetapi dengan ukuran font yang buruk. Ini kode saya untuk meratakan:

UIGraphicsBeginImageContext(CGSizeMake(widthDocument,widthDocument));

for (UILabel *label in arrayLabel) {
    [label drawTextInRect:label.frame];
}

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Ada yang bisa membantu saya?


21
2017-08-08 14:48


asal


Jawaban:


Dari: menarik UIImage dari UITextView atau UILabel memberikan gambar putih.

// iOS

- (UIImage *)grabImage {
    // Create a "canvas" (image context) to draw in.
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0);  // high res
    // Make the CALayer to draw in our "canvas".
    [[self layer] renderInContext: UIGraphicsGetCurrentContext()];

    // Fetch an UIImage of our "canvas".
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    // Stop the "canvas" from accepting any input.
    UIGraphicsEndImageContext();

    // Return the image.
    return image;
}

// Perpanjangan swift dg penggunaan. kredit @Heberti Almeida di bawah komentar

extension UIImage {
    class func imageWithLabel(label: UILabel) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0)
        label.layer.renderInContext(UIGraphicsGetCurrentContext()!)
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img
    }
}

Penggunaan:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 30, height: 22))
label.text = bulletString
let image = UIImage.imageWithLabel(label)

40
2017-08-08 15:08



Saya telah membuat ekstensi Swift untuk merender UILabel menjadi UIImage:

extension UIImage {
    class func imageWithLabel(label: UILabel) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0)
        label.layer.renderInContext(UIGraphicsGetCurrentContext()!)
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img
    }
}

EDIT: Peningkatan versi Swift 4

extension UIImage {
    class func imageWithLabel(_ label: UILabel) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0)
        defer { UIGraphicsEndImageContext() }
        label.layer.render(in: UIGraphicsGetCurrentContext()!)
        return UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()
    }
}

Penggunaannya sederhana:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 30, height: 22))
label.text = bulletString
let image = UIImage.imageWithLabel(label)

14
2017-11-05 13:33



Anda harus membuat label dalam konteks

menggantikan

[label drawTextInRect:label.frame];

dengan

[label.layer renderInContext:UIGraphicsGetCurrentContext()];

dan Anda perlu membuat satu gambar per label, jadi pindahkan loop untuk ke luar mulai dan akhiri panggilan konteks


5
2017-08-08 15:09



untuk Swift, saya menggunakan ekstensi UIView ini:

// Updated for Swift 3.0
extension UIView {
    var grabbedImage:UIImage? {
        get {
            UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0)
            layer.render(in: UIGraphicsGetCurrentContext()!)
            let img = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return img
        }
    }
}

2
2017-07-07 08:05



Anda dapat menggunakan renderInContext pada CALayer mana pun. Ini akan menarik lapisan pandangan Anda pada konteksnya. Sehingga Anda bisa mengubahnya ke sebuah gambar. Juga jika Anda membuat renderInContext pada tampilan, semua subkeposaiannya akan ditarik ke konteks. Jadi, alih-alih melakukan iterasi melalui semua label, sambil menambahkan label, Anda dapat menambahkannya ke containerView. Dan hanya perlu melakukan renderInContext pada containerView tersebut.


1
2017-08-08 19:41