0

我正在尝试将 UIScrollView 的所有内容保存为 .pdf。我找到了一些保存当前视图的教程,它们都依赖于使用UIGraphicsGetCurrentContext(). 现在,我只用

CGContextRef context = UIGraphicsGetCurrentContext();
[myView.layer renderInContext:context];

这适用于普通的 UIView。但是,当我尝试将 UIScrollView 作为传递时myView,它会很好地传递 UIScrollView 的可见部分,但屏幕外的任何内容都只是空白。 有没有一种方法可以扩展context以获取 UIScrollView 中的所有内容,而不仅仅是当前可见的内容? 我怀疑我不能UIGraphicsGetCurrentContext()用于 UIScrollView,但我不知道改用什么,而且Apple 文档对此并没有太大帮助。

4

4 回答 4

4

如果您有一个子视图将滚动视图的整个内容大小与滚动内容一起使用,您可以这样做:

CGContextRef context = UIGraphicsGetCurrentContext();
UIView *contentView = [scrollView subviews][0];
[contentView.layer renderInContext:context];

如果 scrollView 中有多个视图,您可以这样做:

UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(
                                                          scrollView.frame.origin.x,
                                                          scrollView.frame.origin.y, 
                                                          scrollView.contentSize.width, 
                                                          scrollView.contentSize.height)];
for(UIView *view in [scrollView subviews]){
 [contentView addSubview: view];
}

CGContextRef context = UIGraphicsGetCurrentContext();
[contentView.layer renderInContext:context];

然后您需要将视图返回到滚动视图中。可能有一种方法可以复制它们,但我不确定如何。无论如何,这应该起作用:

for(UIView *view in [contentView subviews]){
 [view removeFromSuperView];
 [scrollView addSubview:view];
}
于 2013-03-21T17:41:54.280 回答
0

您可以在调用 renderInContext 之前将 UIScrollView 的框架设置为等于它的内容大小和内容偏移量为 0。之后将帧恢复为原始帧。

myView.frame = CGRectMake(myView.frame.origin.x,myView.frame.origin.y,myView.contentSize.with,myView.contentSize.height);
于 2013-03-21T17:30:04.757 回答
0

这段代码我用来从 uiscrollview 制作 pdf,它确实有帮助,但它不会像我们在 pdf 上绘制那样好——请看——来自 UIScrollView 的 Pdf

- (void) createPDF
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *directroyPath = nil;
    directroyPath = [documentsDirectory stringByAppendingPathComponent:@"temp"];
    NSString *filePath = [directroyPath stringByAppendingPathComponent:@"test.pdf"];
    // check for the "PDF" directory
    NSError *error;
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {

    } else {
        [[NSFileManager defaultManager] createDirectoryAtPath:directroyPath
                                  withIntermediateDirectories:NO
                                                   attributes:nil
                                                        error:&error];
    }

    CGContextRef pdfContext = [self createPDFContext:_scrollView2.bounds path:(CFStringRef)filePath];
    NSLog(@"PDF Context created");

    /*
     Here limit of i is no of pages in your uiscrollview or
     you can use hit and trial here because there is a
     length of page is going to be equal to 
     the visible size of uiscrollView in your application 
   */

    for (int i = 0 ; i< 2 ; i++)
    {

        // page 1
        CGContextBeginPage (pdfContext,nil);

        //turn PDF upsidedown
        CGAffineTransform transform = CGAffineTransformIdentity;

       //here 365 is equal to the height of myScrollView.frame.size.height

        transform = CGAffineTransformMakeTranslation(0, (i+1) * 365);
        transform = CGAffineTransformScale(transform, 1.0, -1.0);
        CGContextConcatCTM(pdfContext, transform);

        //Draw view into PDF
        [_scrollView2.layer renderInContext:pdfContext];
        CGContextEndPage (pdfContext);
        [_scrollView2 setContentOffset:CGPointMake(0, (i+1) * 365) animated:NO];

    }
    CGContextRelease (pdfContext);
}

- (CGContextRef) createPDFContext:(CGRect)inMediaBox path:(CFStringRef) path
{
    CGContextRef myOutContext = NULL;
    CFURLRef url;
    url = CFURLCreateWithFileSystemPath (NULL, path,
                                         kCFURLPOSIXPathStyle,
                                         false);

    if (url != NULL) {
        myOutContext = CGPDFContextCreateWithURL (url,
                                                  &inMediaBox,
                                                  NULL);
        CFRelease(url);
    }
    return myOutContext;
}
于 2014-05-15T10:34:14.113 回答
0

检查ScrollViewToPDF示例并理解它。

它使用相同scrollview's layer renderInContext,但这里的 PDF 是根据您的要求创建的,例如一页 PDF 或多页 PDF

注意:它捕获 scrollView 的所有可见和不可见部分

于 2014-10-27T15:00:07.820 回答