27

私は現在、iPhoneのアプリケーションのようなシンプルなフォトショップを開発しています。レイヤーをフラットにしたい場合、ラベルは適切な位置にありますが、フォントサイズが正しくありません。これがフラット化する私のコードです:

UIGraphicsBeginImageContext(CGSizeMake(widthDocument,widthDocument));

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

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

誰でも私を助けることができますか?

4

6 に答える 6

51

From:UITextViewまたはUILabelからUIImageをプルすると、白い画像が表示されます。

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

//使用法のあるSwift拡張機能。以下のコメントで@HebertiAlmeidaのクレジット

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)
于 2012-08-08T15:08:39.947 に答える
22

をレンダリングするための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
    }
}

編集:改良されたSwift4バージョン

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

使用法は簡単です:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 30, height: 22))
label.text = bulletString
let image = UIImage.imageWithLabel(label)
于 2015-11-05T13:33:34.537 に答える
5

コンテキストでラベルをレンダリングする必要があります

交換

[label drawTextInRect:label.frame];

[label.layer renderInContext:UIGraphicsGetCurrentContext()];

ラベルごとに1つの画像を作成する必要があるため、forループを開始コンテキスト呼び出しと終了コンテキスト呼び出しの外側に移動します

于 2012-08-08T15:09:12.327 に答える
2

Swiftの場合、私はこのUIView-extensionを使用します。

// 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
        }
    }
}
于 2016-07-07T08:05:05.743 に答える
1

任意のCALayerでrenderInContextを使用できます。コンテキスト上にビューのレイヤーを描画します。画像に変更できるように。また、ビューでrenderInContextを実行すると、そのすべてのサブビューがコンテキストに描画されます。したがって、ラベルを追加するときにすべてのラベルを反復処理する代わりに、それらをcontainerViewに追加できます。そして、そのcontainerViewでrenderInContextを実行する必要があります。

于 2012-08-08T19:41:26.487 に答える
1
extension UIImage {

    class func imageFrom(text: String, width: CGFloat, font: UIFont, textAlignment: NSTextAlignment, lineBreakMode: NSLineBreakMode) -> UIImage? {
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
        label.text = text
        label.font = font
        label.textAlignment = textAlignment
        label.lineBreakMode = lineBreakMode

        label.sizeToFit()

        UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0)
        label.layer.render(in: UIGraphicsGetCurrentContext()!)
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img
    }

}

使用:

    let iv = UIImageView(image: UIImage.imageFrom(text: "Test For \nYarik", width: 537.0, font: UIFont.systemFont(ofSize: 30), textAlignment: .center, lineBreakMode: .byWordWrapping))
    iv.contentMode = .scaleAspectFit
于 2018-10-09T14:50:02.090 に答える