屏幕上部分显示的视图的屏幕截图
Posted
技术标签:
【中文标题】屏幕上部分显示的视图的屏幕截图【英文标题】:ScreenShot of view partially shown on screen 【发布时间】:2018-02-15 11:18:44 【问题描述】:为了截取视图,我正在使用此代码
-(UIImage *)renderImageFromView:(UIView *)view
UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[view.layer renderInContext:context];
UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return renderedImage;
现在假设我的视图大于屏幕尺寸,假设它相对于屏幕的矩形是 -100, -100, screenWidth+100, screenHeight+100,我想截取我的这个视图的屏幕截图。 我目前正在使用此代码:
-(UIImage *)renderImageFromView:(UIView *)view withRect:(CGRect)frame
CGRect rect = -100, -100, screenWidth+100, screenHeight+100;
UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[view.layer renderInContext:context];
UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return renderedImage;
但问题是: 最终图像包含来自 0, 0, screenWidth + 100, screenHeight + 100 的视图屏幕截图,但我希望它是 -100, -100, screenWidth + 100, screenHeight + 100。
有什么办法吗?
【问题讨论】:
只是为了澄清。你想从屏幕上截取一些东西吗? 是的,我想要部分在屏幕外的内容截图 我希望第一种方法即使对于大于屏幕的视图也可以工作。你试过了吗? @MilanNosáľ 是的,我做到了。但是因为我使用的是 UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0),所以这只会生成屏幕大小的上下文 但是view.bounds
定义了上下文.. 你的意思是有些东西超出了视图的范围?
【参考方案1】:
您必须先将该视图设置到屏幕中,并将原点设置为 (0,0),然后再将该存储指向某个临时变量,以便在截取屏幕截图后将其重新分配。
现在将该偏移量添加到宽度和高度,就像您查看 x 为 -100 一样,然后将其添加到宽度 + 100 并设置 x = 0。同样适用于 y。
现在创建UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0);
和renderInContext
并制作正确的屏幕截图。并且不要忘记将原始框架设置回视图。
希望对你有帮助
【讨论】:
【参考方案2】:您的问题是上下文只需要大小,而不是框架,因此将rect
的原点设置为-100, -100
无效。我相信解决方案是创建一个大小在两个方向上都大 200 点的上下文,然后告诉视图在该上下文的点 (100, 100)
处呈现自己。为了设置绘制位置的相对原点,我尝试在视图层上使用变换。
很抱歉使用了 Swift,但我相信你可以轻松地将其重写为 ObjC:
func renderImageFromView(view: UIView) -> UIImage?
let size = CGSize(width: view.bounds.size.width + 200, height: view.bounds.size.height + 200)
UIGraphicsBeginImageContextWithOptions(size, true, UIScreen.main.scale)
let context = UIGraphicsGetCurrentContext()!
view.layer.transform = CATransform3DMakeAffineTransform(CGAffineTransform.identity.translatedBy(x: 100, y: 100))
view.layer.render(in: context)
view.layer.transform = CATransform3DMakeAffineTransform(CGAffineTransform.identity)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
【讨论】:
空图显示:(以上是关于屏幕上部分显示的视图的屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章
与 iPhone 相比,在 XIB 中显示在不同位置的对象(包括屏幕截图)
为啥在 layoutsubviews/viewdidlayoutsubviews 中捕获的视图的屏幕截图不是最终在屏幕上呈现的?
如何捕获当前视图屏幕截图并在代码中重用? (iPhone SDK)