屏幕上部分显示的视图的屏幕截图

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)

如何在 Pytest JUNIT xml 中附加屏幕截图以显示在 Azure DevOps 上?

iOS - Scrollview 屏幕截图显示灰色部分

使用 Java 代码在 Android 上捕获屏幕截图 [重复]