【问题标题】: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 定义了上下文.. 你的意思是有些东西超出了视图的范围?

标签: ios objective-c ipad


【解决方案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
    }
    

    【讨论】:

    • 空图显示:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多