Подтвердить что ты не робот

Как создать изображение из UILabel?

В настоящее время я разрабатываю простой фотошоп, например приложение на iphone. Когда я хочу сгладить свои слои, ярлыки находятся в хорошем положении, но с плохим размером шрифта. Здесь мой код для сглаживания:

UIGraphicsBeginImageContext(CGSizeMake(widthDocument,widthDocument));

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

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

Кто-нибудь может мне помочь?

4b9b3361

Ответ 1

От: вытаскивание UIImage из UITextView или UILabel дает белое изображение.

//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;
}

//Быстрое расширение w/использование. кредит @Heberti Almeida в комментариях ниже

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
    }
}

Использование:

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

Ответ 2

Я создал расширение Swift, чтобы сделать UILabel в 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
    }
}

Использование прост:

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

Ответ 3

вам нужно отобразить метку в контексте

заменить

[label drawTextInRect:label.frame];

с

[label.layer renderInContext:UIGraphicsGetCurrentContext()];

и вам нужно будет создать одно изображение на ярлык, поэтому переместите цикл for за пределы начальных и конечных контекстных вызовов

Ответ 4

Вы можете использовать renderInContext для любого CALayer. Он нарисует ваш слой в контексте. Чтобы вы могли изменить его на изображение. Также, если вы сделаете renderInContext в представлении, все его подпрограммы будут нарисованы в контексте. Поэтому вместо повторения всех ярлыков, добавляя метки, вы можете добавить их в контейнер. И просто нужно сделать renderInContext в этом контейнере.

Ответ 5

для Swift, я использую это расширение UIView:

// 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
        }
    }
}