Swift - 创建屏幕上和屏幕外的 UITextView 内容图像

Swift - Create image of UITextView content that is both onscreen and offscreen

我有一个占据整个场景(视图)的 UITextView。 textviews 的长度取决于内容的多少。它可能很长,因此不会全部显示在屏幕上——您必须滚动才能看到其余部分。此外,内容可以使用 NSTextAttachment 在其中包含图像。 我的目标是创建整个文本视图的图像。它甚至应该包括屏幕外的内容(当前不可见)。这是我目前所拥有的:

func textViewImage() -> UIImage {

    UIGraphicsBeginImageContext(textView.contentSize)

    let savedContentOffset: CGPoint = textView.contentOffset
    let savedFrame: CGRect = textView.frame

    textView.contentOffset = CGPointZero
    textView.frame = CGRectMake(0, 0, textView.contentSize.width, textView.contentSize.height)

    textView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()

    textView.contentOffset = savedContentOffset
    textView.frame = savedFrame

    UIGraphicsEndImageContext()

    return image
}

这不起作用。它只拍摄屏幕上当前可见的内容。我通过尝试通过短信或邮件:

分享它来检查这段代码是否有效
 @IBAction func share(sender: UIBarButtonItem) {

    let shareTextViewImage = textViewImage()
    let activityController = UIActivityViewController(activityItems: [shareTextViewImage], applicationActivities: nil)

    self.presentViewController(activityController, animated: true, completion: nil)

}

感谢这个 post 和其他人 Getting a screenshot of a UIScrollView, including offscreen parts

期待您的帮助!谢谢!

更新 1: 我创建了这个变量 var pageSize: CGSize = CGSizeMake(320, 800) 并尝试像这样添加它:UIGraphicsBeginImageContext(pageSize)。这也不起作用,因为它只拍摄当前屏幕截图。无论如何,这是一个固定大小,不会在很长的 运行 中工作,因为内容大小可能会改变 --- 只是想看看它是如何工作的。

仍在寻找答案...

我自己想出来了。这对我有用:

    func textViewImage() -> UIImage {

    var image: UIImage? = nil

    UIGraphicsBeginImageContextWithOptions(textView.contentSize, textView.opaque, 0.0)

    let savedContentOffset: CGPoint = textView.contentOffset
    let savedFrame: CGRect = textView.frame

    textView.contentOffset = CGPointZero
    textView.frame = CGRectMake(0, 0, textView.contentSize.width, textView.contentSize.height)

    textView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    image = UIGraphicsGetImageFromCurrentImageContext()

    textView.contentOffset = savedContentOffset
    textView.frame = savedFrame

    UIGraphicsEndImageContext()

    return image!
}

如果你想分享这张图片:

    @IBAction func share(sender: UIBarButtonItem) {

    let img = textViewImage()
    let shareItem = [img]

    let activityController = UIActivityViewController(activityItems: shareItem, applicationActivities: nil)
    self.presentViewController(activityController, animated: true, completion: nil)

}