Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 full screenshot it's cutting. Below is output picture for less than iOS 12 and after iOS 13. Less than iOS 12

iOS 13

Below is code I'm using to take screenshot of UITextView:

let textView = UITextView()
UIGraphicsBeginImageContextWithOptions(textView.contentSize, textView.isOpaque, 0.0)
let savedContentOffset: CGPoint = textView.contentOffset
let savedFrame: CGRect = textView.frame
textView.frame = CGRect(x: 0, y: 0, width: textView.contentSize.width, height: textView.contentSize.height)
textView.layer.render(in: UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
textView.contentOffset = savedContentOffset
textView.frame = savedFrame
UIGraphicsEndImageContext()

I got the solution for this issue Below is UPDATED 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

like image 606
Aslam Avatar asked Oct 16 '19 02:10

Aslam


1 Answers

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()
like image 169
Code Farmer Avatar answered Oct 10 '22 10:10

Code Farmer