How to get a snapshot of UITableView in a PDF format

前端 未结 5 481
一向
一向 2021-01-31 12:22

I have a UITableView which is populated with some data but since it contains data that is more cells than the viewable area of the screen, I only managed to get onl

5条回答
  •  梦谈多话
    2021-01-31 13:12

    Here's how you can do it without scrolling the tableview. Simply increase the height of the scrollview to the contentSize. The quality of the PDF is also better if you don't go via a UIImage. This is from my UITableView extension in Swift. The code is stolen from here and there so the comments aren't always mine.

    func toPDF(fileName: String) -> String {
        // Don't include scroll indicators in file
        self.showsVerticalScrollIndicator = false
    
        // Creates a mutable data object for updating with binary data, like a byte array
        let pdfData = NSMutableData()
    
        // Change the frame size to include all data
        let originalFrame = self.frame
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.contentSize.width, self.contentSize.height)
    
        // Points the pdf converter to the mutable data object and to the UIView to be converted
        UIGraphicsBeginPDFContextToData(pdfData, self.bounds, nil)
        UIGraphicsBeginPDFPage()
        let pdfContext = UIGraphicsGetCurrentContext();
    
        // Draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData
        self.layer.renderInContext(pdfContext!)
    
        // Remove PDF rendering context
        UIGraphicsEndPDFContext()
    
        // Retrieves the document directories from the iOS device
        let documentDirectories: NSArray = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    
        let documentDirectory = documentDirectories.objectAtIndex(0)
        let documentDirectoryFilename = documentDirectory.stringByAppendingPathComponent(fileName);
    
        // Instructs the mutable data object to write its context to a file on disk
        pdfData.writeToFile(documentDirectoryFilename, atomically: true)
    
        // Back to normal size
        self.frame = originalFrame
    
        // Put back the scroll indicator
        self.showsVerticalScrollIndicator = true
    
        return documentDirectoryFilename
    }
    

提交回复
热议问题