iOS 13 UITextView converting UITextView to image is not working properly. Working fine in below iOS 12

后端 未结 5 1607
鱼传尺愫
鱼传尺愫 2020-12-10 07:28

How to solve this issue in iOS 13? I am taking screenshot of UITextView content size..Till iOS 12 everything is working fine. But issue with iOS 13 onwards it\'s not taking

相关标签:
5条回答
  • 2020-12-10 08:00

    The following worked for me

    extension UITextView {
    /**
     Convert TextView to UIImage
     */
     func toImage() -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.isOpaque, 0.0)
        defer { UIGraphicsEndImageContext() }
        if let context = UIGraphicsGetCurrentContext() {
            self.layer.render(in: context)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            return image
        }
        return nil
      }
    }
    

    Use:

    UIImageWriteToSavedPhotosAlbum(self.textView.toImage()!,self, nil, nil)
    
    0 讨论(0)
  • 2020-12-10 08:03

    To get this to work, I had to use a UILabel when rendering.

    It's configured with the same constraints/font/text as the textview, and when rendering - set the text in the label, hide the textview and show the label, and vice versa. Perhaps a little less complicated for me since the view I am rendering is not on the screen, but might still be an option.

    0 讨论(0)
  • 2020-12-10 08:07

    Don't draw the layer, use the attributedText instead

    let size = self.textView.contentSize
    UIGraphicsBeginImageContextWithOptions(size, self.textView.isOpaque, 0)
    //the textView has 8 margin
    textView.attributedText.draw(in: CGRect.init(x: 0, y: 0, width: size.width - 16, height: size.height))
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    0 讨论(0)
  • 2020-12-10 08:14

    Seems that the issue is with the layer for me setting the content size for the layer worked. before the render in context set the layer frame property with the size required this will draw the complete content in the image. hope this helps

    0 讨论(0)
  • 2020-12-10 08:23

    Try to use UIlabel or TempView or Third party library Below is Working code

    OPTION 1:- Below code using UILabel

    let SCREEN_WIDTH = UIScreen.main.bounds.size.width
    let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
    func buttonAction() {
        let textView = UITextView()
        textView.frame = CGRect(x: 10, y: 50, width: SCREEN_WIDTH - 20, height: SCREEN_HEIGHT * 2)
    
        let lab = UILabel(frame: CGRect(x: 0, y: 0, width: SCREEN_WIDTH - 20, height: textView.contentSize.height))
        lab.backgroundColor = UIColor.white
        lab.font = textView.font
        lab.textColor = UIColor.black
        lab.numberOfLines = 0
        lab.text = textView.text
        textView.addSubview(lab)
    
        UIGraphicsBeginImageContextWithOptions(CGSize(width: SCREEN_WIDTH - 20, height: textView.contentSize.height), _: true, _: 1)
        if let context = UIGraphicsGetCurrentContext() {
            lab.layer.render(in: context)
        }
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    
        textView.frame = CGRect(x: 10, y: 50, width: SCREEN_WIDTH - 20, height: SCREEN_HEIGHT * 2)
        lab.removeFromSuperview()
    
    }
    

    OPTION 2:- Below code using TempView

    let SCREEN_WIDTH = UIScreen.main.bounds.size.width
    let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
    
    func buttonAction() {
       let textView = UITextView()
       textView.frame = CGRect(x: 10, y: 50, width: SCREEN_WIDTH - 20, height: SCREEN_HEIGHT * 2)
       UIGraphicsBeginImageContextWithOptions(CGSize(width: SCREEN_WIDTH - 20, height: textView.contentSize.height), _: true, _: 1)
    
       if #available(iOS 13, *) {
        // iOS 13 (or newer)
        let tempView = UIView(frame: CGRect(x: 0, y: 0, width: textView.contentSize.width, height: textView.contentSize.height))
        tempView.addSubview(textView)
        if let context = UIGraphicsGetCurrentContext() {
            tempView.layer.render(in: context)
        }
        tempView.removeFromSuperview()
        view.addSubview(textView)
     } else {
        // iOS 12 or older
        if let context = UIGraphicsGetCurrentContext() {
            textView.layer.render(in: context)
        }
    }
    

    OPTION 3:- Try to use third party library i have used YYTextView https://github.com/ibireme/YYText

    0 讨论(0)
提交回复
热议问题