0

尽管对 Google、So 和http://developer.apple.com/library/ios/#documentation/2ddrawing/conceptual/drawingprintingios/GeneratingPDF/GeneratingPDF.html进行了研究。我仍然无法用我的应用程序找到这个问题的答案。加载视图后,我的应用程序会立即生成一个绘制到 Web 视图中的 PDF。问题是在收到内存警告和崩溃之前,我只能在 iPhone 4s 上生成大约 8 页,在 iPhone 5 上生成 14 页。

ICPDFEICRInspection12,3,4 等是被绘制到 web 视图中的大视图/xib

目前该应用程序生成所有页面,然后将整个文档显示在webView.

我的问题: 我怎样才能改变这一点,所以我只在用户滚动时一次绘制一页,而不是先将它全部加载到内存中,循环遍历内容,一次绘制一页

 - (void)viewWillAppear:(BOOL)animated
{
LogCmd();

 [super viewWillAppear:animated];
 if (self.pdfData != nil && self.viewHasUnloaded == YES) {
    self.viewHasUnloaded = NO;
    [self.webView loadData:self.pdfData MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil];
    }
   }



- (void)viewDidAppear:(BOOL)animated
  {

  LogCmd();
  [super viewDidAppear:animated];
  if (self.pdfData == nil) {



    // Generate PDF
     [ICUtils showProgressViewWithTitle:@"Generating PDF. This may take a minute..."];
     [self performSelectorInBackground:@selector(generatePdf) withObject:nil];
  }
 }

  - (void)generatePdf
   {
   NSMutableArray *pagesArray = [NSMutableArray array];

  if ([self.certificate.certificateType.title isEqualToString:@"EICR"]) {
    [pagesArray addObject:[[ICPDFEICRPage1 alloc] initWithCertificate:self.certificate]];
    [pagesArray addObject:[[ICPDFEICRPage2 alloc] initWithCertificate:self.certificate]];
    [self addObservationsToPagesArray:pagesArray];
    [self addDistributionBoardsToPagesArray:pagesArray];
    [pagesArray addObject:[[ICPDFEICRInspection alloc] initWithCertificate:self.certificate]];
    [pagesArray addObject:[[ICPDFEICRInspectionPage1 alloc] initWithCertificate:self.certificate]];
    [pagesArray addObject:[[ICPDFEICRInspectionPage2 alloc] initWithCertificate:self.certificate]];
    [pagesArray addObject:[[ICPDFEICRInspectionPage3 alloc] initWithCertificate:self.certificate]];
    [pagesArray addObject:[[ICPDFEICRPageFinal alloc] initWithCertificate:self.certificate]];
   }

  // Set page count on all pages
int pageNumber = 0;
for (ICCertificateComponent *page in pagesArray) {
    page.pageNumber.text = [NSString stringWithFormat:@"%d", ++pageNumber];
    page.pageCount.text = [NSString stringWithFormat:@"%d", pagesArray.count];
  }

   NSData *pdfData = [self createPdfWithPages:pagesArray];
  [self performSelectorOnMainThread:@selector(pdfDone:) withObject:pdfData waitUntilDone:YES];

  }
  }
     - (void)pdfDone:(NSData *)data
   {
self.pdfData = data;
[self.webView loadData:self.pdfData MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil];
[ICUtils removeProgressView];
 }

  - (NSData *)createPdfWithPages:(NSArray *)pages
  {
// Creates a mutable data object for updating with binary data, like a byte array

  NSMutableData *pdfData = [NSMutableData data];

  ICCertificateComponent *firstPage = [pages objectAtIndex:0];

   UIGraphicsBeginPDFContextToData(pdfData, firstPage.contentView.bounds, nil);

  for (int i = 0; i < pages.count; i++) {
    ICCertificateComponent *thisPage = [pages objectAtIndex:i];
    UIGraphicsBeginPDFPageWithInfo(thisPage.contentView.bounds, nil);

    CGContextRef pdfContext = UIGraphicsGetCurrentContext();
    [thisPage.contentView.layer renderInContext:pdfContext];
   }

 UIGraphicsEndPDFContext();

return pdfData;

}
4

2 回答 2

0

您将所有 PDF 数据生成到内存数据结构中,这是一个坏主意。尝试使用UIGraphicsBeginPDFContextToFile先将 PDF 数据写入文件。完成后,将其加载到 Web 视图中。

于 2013-05-03T11:02:32.747 回答
-2

一些可能的方法:

  1. 界面视图。每个单元格包含一个页面。iOS 要求您按需创建单元格和页面,并且只保留足够填满屏幕的内容。问题是 PDF 页面的呈现需要大量时间,这会使滚动变得生涩。

  2. UICollectionView。相同但允许更大的灵活性,例如从左到右的页面。

  3. CATiledLayer。像谷歌地图一样,您可以通过在后台渲染来平滑滚动。我发现更复杂,实际上在显示文档方面并没有那么好。

  4. 创建一个 PDF 文件供 webView 渲染,而不是将所有页面渲染到内存。系统会处理内存,它会平滑滚动而不会出现伪影。如果 PDF 页面不变,可能是您最好的选择。

于 2013-05-03T11:22:03.167 回答