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

时间:2015-09-22 03:08:13

标签: ios swift uiscrollview uikit uitextview

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

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)

}

由于这篇关于SO和其他人Getting a screenshot of a UIScrollView, including offscreen parts的帖子,我得到了我所做的一切。

期待一些帮助!谢谢!

更新1: 我创建了这个变量var pageSize: CGSize = CGSizeMake(320, 800)并尝试添加它:UIGraphicsBeginImageContext(pageSize)。这不起作用,因为它只拍摄当前屏幕。无论如何这是一个固定的大小,从长远来看不会起作用,因为内容大小可能会改变 - 只是想知道这将如何解决。

仍在寻找答案......

1 个答案:

答案 0 :(得分:3)

我自己想通了。这对我有用:

    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)

}