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
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)
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.
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()
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
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