ScreenShot视图部分显示在屏幕上

时间:2018-02-15 11:18:45

标签: ios objective-c ipad

要获取视图的屏幕截图,我正在使用此代码

-(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}。

任何解决方案?

2 个答案:

答案 0 :(得分:0)

您必须首先将该视图设置为屏幕,并将该设置原点设置为(0,0),然后指向某个临时变量的商店,以便在获取屏幕截图后将其分配回来。

现在将该偏移量添加到宽度和高度,就像您查看x是-100然后将其添加到宽度+ 100并设置x = 0.同样适用于y。

现在创建SIGTERMSIGKILL并进行正确的屏幕截图。并且不要忘记将原始帧设置回来查看。

希望它有用

答案 1 :(得分:0)

在您的情况下,问题是上下文只是大小而不是框架,因此将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
}