首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带CGPDFDocumentRef的PDF阅读器

带CGPDFDocumentRef的PDF阅读器
EN

Stack Overflow用户
提问于 2010-07-24 15:56:42
回答 3查看 8.6K关注 0票数 0

我将制作一个PDF阅读器,我正在尝试两个可能的解决方案:

  • UIWebView

  • CGPDFDocumentRef

第一个很简单,但比第二个慢。对于第二个,我找到了一个教程,我可以查看一个pdf,我可以缩放它的两个手指的运动。但现在我不能做两件事:

1)在景观模式下查看PDF,保持正确的比例。2)放大/放大屏幕上的双击。

这些函数已经在UIWebView中实现了,但是说起来有点慢,它打开了整个PDF文档,而不仅仅是一个页面(所以我需要在许多“一个页面pdf文件”中分割文件)。

有人能帮我做一些关于这类问题的链接/参考/代码吗?

EN

回答 3

Stack Overflow用户

发布于 2010-07-24 16:18:44

使用CGPDFDocumentRef时,需要使用CGPDFDocumentGetPage获取每个页面,然后使用CGPDFPageGetDrawingTransform获取绘图转换,并在绘制页面之前将其应用于CGContextRef

如果您启用缩放功能,将UIScrollView中的PDF页面放置在视图中将允许您放大和缩小。您也可以使用缩放因子绘制它

代码语言:javascript
复制
    CGContextTranslateCTM (context, -sourceRect.origin.x * zoom, -sourceRect.origin.y * zoom);
    CGContextScaleCTM (context, zoom, zoom);

但是您仍然会遇到这样的问题:非常复杂的PDF页面呈现速度很慢,每次调用CGContextDrawPDFPage(context, page);时都必须呈现整个页面,例如当您更改缩放级别时。有一些方法可以解决这一问题,例如绘制到CATiledLayer中。

票数 3
EN

Stack Overflow用户

发布于 2010-07-24 20:28:21

确切地说,在我找到的示例中,他使用了CATiledLayer。

这是我的代码:

代码语言:javascript
复制
- (void)viewDidLoad
{
    [super viewDidLoad];
    CFURLRef pdfURL = CFBundleCopyResourceURL(
                                              CFBundleGetMainBundle(),
                                              CFSTR(filename),
                                              CFSTR("pdf"), NULL);
    myDocumentRef = CGPDFDocumentCreateWithURL(pdfURL);
    myPageRef = CGPDFDocumentGetPage(myDocumentRef, 1);
    CGRect pageRect = CGRectMake(0, 0, 320, 480); 

    tiledLayer = [CATiledLayer layer];
    tiledLayer.delegate = self;
    tiledLayer.tileSize = CGSizeMake(1024.0, 1024.0);
    tiledLayer.levelsOfDetail = 1000;
    tiledLayer.levelsOfDetailBias = 1000;
    tiledLayer.frame = pageRect;

    myContentView = [[UIView alloc] initWithFrame:pageRect];
    [myContentView.layer addSublayer:tiledLayer];

    CGRect viewFrame = self.view.frame;
    viewFrame.origin = CGPointZero;
    scrollView = [[UIScrollView alloc] initWithFrame:viewFrame];
    scrollView.delegate = self;
    scrollView.contentSize = pageRect.size;
    scrollView.maximumZoomScale = 100;
    [scrollView addSubview:myContentView];

    [self.view addSubview:scrollView];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return myContentView;
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
    CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));
    CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);
    CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(myPageRef, kCGPDFCropBox, layer.bounds, 0, true));
    CGContextDrawPDFPage(ctx, myPageRef);
}

这个部分很好用,但是如果我想介绍景观模式,我需要修改这个部分:

代码语言:javascript
复制
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if( (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) ||
       (interfaceOrientation == UIInterfaceOrientationLandscapeRight)){
        //SOMETHING TO DO FOR LANDSCAPE MODE
    }
    else if((interfaceOrientation == UIInterfaceOrientationPortrait)){
        //SOMETHING TO DO TO RESTORE TO PORTRAIT
    }
    // Return YES for supported orientations
    return ((interfaceOrientation == UIInterfaceOrientationPortrait) ||
            (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) ||
            (interfaceOrientation == UIInterfaceOrientationLandscapeRight));
}

我什么都试过了,但我找不到一个好的解决办法!

票数 1
EN

Stack Overflow用户

发布于 2011-01-18 13:46:18

您可以手动调用任意层的绘制层方法,方法是: yourLayer setNeedsDisplay

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3325742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档