2016-07-25 9 views
0

나는 tableView의 전체 내용에서 PDF를 생성하려고합니다. 나는 (내가 생각하기에) stackoverflow에서 모든 예제를 시도하고 tableView의 행이 하나의 pdf 페이지에 들어 맞는 경우에만 작동한다. 두 페이지 이상을 포함하는 모든 데이터는 생성 할 수 없습니다. 그것을 주석 모든 페이지를 (죄송합니다, 저자을 기억하지 않는다)많은 페이지가있는 PDF로 UITable보기 (생성 할 수 없음)

 var pdfData = NSMutableData() 
     UIGraphicsBeginPDFContextToData(pdfData, CGRectMake(0, 0, 612,792), nil); 
     UIGraphicsBeginPDFPage(); 
     self.view.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
     self.tableView.scrollRectToVisible(CGRectMake(0, 0, 1, 1), animated:false) 
     self.tableView.layer.renderInContext(UIGraphicsGetCurrentContext()!) 

     let screensInTable:CGFloat = self.tableView.contentSize.height/self.tableView.frame.height; 
     print("how many screens: \(screensInTable)") 
     for i in 1..<Int(screensInTable) { 
      let contentOffset = CGPointMake(0, CGFloat(i) * 100)//self.tableView.frame.height 
      print("content offset: \(contentOffset)") 
      self.tableView.setContentOffset(contentOffset, animated:false) 
      self.tableView.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
     } 

     UIGraphicsEndPDFContext(); 

     let activityViewController = UIActivityViewController(activityItems: [pdfData], applicationActivities: nil) 
     dispatch_async(dispatch_get_main_queue(), { 

      self.presentViewController(activityViewController, animated: false, completion: nil) 
     }) 

문제는 라인에 있습니다 : : : (거짓 애니메이션 contentOffset) self.tableView.setContentOffset

현재이 조각을 사용하여 생성되지만 첫 번째 콘텐츠에만 내용이 있습니다. 이 같은 떠날 때, activityViewController-에> 인쇄 미리보기는 끝없이 나는 또한 셀의 단일있는 contentView을 렌더링하기 위해 노력했습니다 미리보기

를로드하지만 tableView.subviews을 반복 할 때 그것은 단지 눈에 보이는 세포

답변

0

I의 전망을 포함 내용이 보이지 않아도 tableView에 대한 PDF를 생성했습니다. 당신이 다음 세트 스냅 샷을 할 수 있도록 y 값이 위쪽으로 부정적인 다음 콘텐츠 변화 자체를 번역하는 경우

주요 논리는

CGContextTranslateCTM(UIGraphicsGetCurrentContext(), rect.origin.x, -rect.origin.y);

을 사용하고 있습니다. 그렇지 않으면 볼 수있는 스크린 샷 만 수신하게됩니다. 다음

내가 당신은 당신의 필요에이를 수정할 수 있습니다

func getScreenShot(aView : UIView, forRect rect : CGRect) -> UIImage { 
    // Preserve the previous frame and contentOffset of the scrollView (tableView) 
    let frame = aView.frame 
    var offset : CGPoint? 

    // Get offset only if view is scrollView 
    if let aView = aView as? UIScrollView { 
     offset = aView.contentOffset 
    } 

    UIGraphicsBeginImageContextWithOptions(rect.size, false, UIScreen.mainScreen().scale) 

    // Move the frame for the screenshot starting position 
    CGContextTranslateCTM(UIGraphicsGetCurrentContext(), rect.origin.x, -rect.origin.y); 

    // Set the new size for the view 
    aView.frame.size = rect.size 

    // Set the new contentOffset for the view only if it's a scrollView 
    if let aView = aView as? UIScrollView { 
     aView.contentOffset.y = rect.origin.y 
    } 

    aView.drawViewHierarchyInRect(rect, afterScreenUpdates: true) 

    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    // Reset the previous frame 
    aView.frame = frame 

    // Reset offset only if view is scrollView 
    if let aView = aView as? UIScrollView { 
     aView.contentOffset = offset! 
    } 

    return image 
} 
있는 tableView

에서 이미지를 생성하기 위해 사용되는 코드입니다. 또한 당신이 7 아이폰 OS를 지원하고 위의 그것을 훨씬 빠르게 renderInContext 이상이기 때문에하는 경우 당신이

drawViewHierarchyInRect(rect, afterScreenUpdates: true)

를 사용하는 것이 좋습니다 것입니다.

+0

여전히 불행하게도 작동하지 않습니다. (html 작성을 끝내고 보고서로 보냈습니다. – repoguy