Swift - 创建屏幕上和屏幕外的 UITextView 内容的图像
Posted
技术标签:
【中文标题】Swift - 创建屏幕上和屏幕外的 UITextView 内容的图像【英文标题】:Swift - Create image of UITextView content that is both onscreen and offscreen 【发布时间】:2015-09-22 03:08:12 【问题描述】:我有一个 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)
感谢 SO 和其他人 Getting a screenshot of a UIScrollView, including offscreen parts 上的这篇帖子,我做到了。
期待一些帮助!谢谢!
更新 1:
我创建了这个变量var pageSize: CGSize = CGSizeMake(320, 800)
并尝试像这样添加它:UIGraphicsBeginImageContext(pageSize)
。这也不起作用,因为它只需要当前的屏幕截图。无论如何,这是一个固定大小,从长远来看是行不通的,因为内容大小可能会改变——只是想看看这会如何。
仍在寻找答案...
【问题讨论】:
为什么不直接将文本视图的文本绘制到图形上下文中,而不是渲染文本视图。你只需要文本和适当的框架(你有)。 @rmaddy 你能告诉我如何在代码中做到这一点吗?抱歉,我是新手,不明白这段代码的工作原理。 @rmaddy 我尝试了您提到的内容并更新了我的问题。它不起作用。我什至不确定我是否完全按照你说的去做。我在正确的轨道上吗? 【参考方案1】:我自己想通了。这对我有用:
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)
【讨论】:
简单直接的答案!但是,如果我想修改 UITextView 中的内容怎么办?例如:更改字体大小、添加背景颜色等, 另外,我的UITextView
周围有一个框架来复制UITextField
,甚至在绘制图像时也包括在内! :-/
@Shyam 嗯好问题。我已经有一段时间没有做这个了,所以不完全确定。据我所知,它会对屏幕上当前可见的任何内容进行拍照。我不确定您是否可以在同时拍摄所有照片之前更改字体、大小等。对于我的简单用例,我只是按原样拍摄了屏幕上 100% 的照片。
:) ...我不需要更改任何内容,您的代码就像一个魅力。我的UITextView
周围有一个边框,即使它出现在图像中,但我不希望这种情况发生。在我学习的过程中,我对 swift 非常陌生,将所有内容拼凑在一起。但是,你能解释一下你的代码吗?在此先感谢...
我想截取 textView 的所有内容,即使滚动/关闭屏幕,但它只是给了我视图的屏幕截图,它仅等于 textview 框架,而不是整个内容。 @JEL以上是关于Swift - 创建屏幕上和屏幕外的 UITextView 内容的图像的主要内容,如果未能解决你的问题,请参考以下文章
WPF RibbonWindow + Ribbon = 屏幕外的标题?