捕获/渲染 Scrollview 的屏幕外内容

Posted

技术标签:

【中文标题】捕获/渲染 Scrollview 的屏幕外内容【英文标题】:Capture/render Scrollview's offscreen content 【发布时间】:2012-07-19 08:54:28 【问题描述】:

我也想将滚动视图的屏幕外内容渲染为图像。

但以下代码仅在屏幕上呈现内容,即使它应该呈现整个 scrollView 内容。

谁能提供帮助?

提前致谢!

UIImage *image = nil;

 UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, false, 0.0);
 
        CGPoint savedContentOffset = scrollView.contentOffset;
        CGRect savedFrame = scrollView.frame;

        scrollView.contentOffset = CGPointMake(0.0, 0.0);
        scrollView.frame = CGRectMake(0, 0.0, scrollView.contentSize.width, scrollView.contentSize.height);

        NSLog(@"%.2f",scrollView.contentSize.height);

        [scrollView.layer renderInContext:UIGraphicsGetCurrentContext()];
        image = UIGraphicsGetImageFromCurrentImageContext();

        scrollView.contentOffset = savedContentOffset;
        scrollView.frame = savedFrame;


UIGraphicsEndImageContext();

【问题讨论】:

看看这里:***.com/questions/5268943/… @divol – 我尝试实现 Nikesh 的代码,但我创建的 pdf 文件似乎已损坏…… 【参考方案1】:

原来我的自动调整大小设置不正确,所以滚动视图的下部没有移动……

以下代码运行良好:

代码:

- (UIImage *)createPicture

[self setMasks:true];
UIImage *image = nil;

UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, false, 0.0);

    CGPoint savedContentOffset = scrollView.contentOffset;
    CGRect savedFrame = scrollView.frame;

    scrollView.contentOffset = CGPointMake(0.0, 0.0);
    scrollView.frame = CGRectMake(0, 0.0, scrollView.contentSize.width, scrollView.contentSize.height);

    NSLog(@"%.2f",scrollView.contentSize.height);

    [scrollView.layer renderInContext:UIGraphicsGetCurrentContext()];
    image = UIGraphicsGetImageFromCurrentImageContext();

    scrollView.contentOffset = savedContentOffset;
    scrollView.frame = savedFrame;


UIGraphicsEndImageContext();

[self setMasks:false];

return image;


- (void)setMasks:(bool)photo

if (photo) 
    for (label in labels)
    
        label.autoresizingMask = (UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin);
    

【讨论】:

【参考方案2】:

嗯,你可以尝试不同的方法。

像现在一样创建上下文(真的很高)并设置 currentOffset

将你的 scrollView 对齐到上下文的顶部,并渲染一屏。

将 contentOffset.y 更改为 scrollView 的高度

在上下文中按滚动视图高度偏移渲染下一屏

所以你实际上是一次渲染一个页面。

【讨论】:

我也有同样的想法,但是如何将这些页面放在一个文件中? 所以想法是创建第一个足够大的上下文以容纳所有内容 - 即它的 contentSize.height。然后你基本上一次绘制一页内容。完成后,您可以请求 UIImage,它的大小应与 contentSize 相同。【参考方案3】:

(IBAction)screenShot:(id)sender

scrollView.frame = CGRectMake(0, 0, 320, 700);

UIGraphicsBeginImageContext(scrollView.frame.size);

CGContextRef c = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(c, 0, 60); [self.view.layer renderInContext:c]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

//保存到相册或通过以下代码分享图片

NSArray * itemsToShare = @[viewImage];

UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:itemsToShare applicationActivities:nil];

activity.excludedActivityTypes = @[];

[self presentViewController:activity Animation:YES completion:nil];

【讨论】:

以上是关于捕获/渲染 Scrollview 的屏幕外内容的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使滚动视图不覆盖整个屏幕?

从纹理渲染到屏幕外纹理 (FBO)

渲染后将原生重置 ScrollView 反应到顶部

使用 QOpenGLWidget 进行屏幕外渲染的最简单方法

如何捕获包含所有内容的 UIWebview 的屏幕截图?

scrollView 中scrollView 的水平滚动 - 小问题