Захват всего диапазона ячеек tableview в моментальном снимке для печати и совместного использования

#swift #uitableview #uiscrollview #spreadsheet

#swift #uitableview #uiscrollview #электронная таблица

Вопрос:

Я пытаюсь сделать снимок всего scrollview, «scrollview» — это tableview, который является модулем просмотра электронных таблиц. SpreadsheetView на самом деле является scrollview / tableview. Способ, которым я это настроил, — отменить запрос на использование ячейки. На самом деле я не знаю другого способа, поскольку я новичок во всем этом. Проблема в том, что это приводит к отображению изображения только на части сохраненного моментального снимка.

Как я могу захватить весь spreadsheetview / tableview?

Я искал и искал, но я не нашел никакого убедительного способа сделать это, который я мог бы понять или настроить…

Функция совместного использования:

 // Share function for share button
@objc func shareTapped() {
    
    UIGraphicsBeginImageContext(spreadsheetView.contentSize)

    let savedContentOffset = spreadsheetView.contentOffset
    let savedFrame = spreadsheetView.frame

    spreadsheetView.contentOffset = CGPoint.zero
    spreadsheetView.frame = CGRect(x: 0, y: 0, width: spreadsheetView.contentSize.width, height: spreadsheetView.contentSize.height)

    spreadsheetView.layer.render(in: UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()

    spreadsheetView.contentOffset = savedContentOffset
    spreadsheetView.frame = savedFrame

    UIGraphicsEndImageContext()
    
    // Give sharing functionality
    let vc = UIActivityViewController(activityItems: [image!], applicationActivities: [])
    vc.excludedActivityTypes = [.assignToContact, .addToReadingList]
    vc.popoverPresentationController?.barButtonItem = navigationItem.rightBarButtonItem
    present(vc, animated: true)
    
}
  

Настройка просмотра электронных таблиц:

 // First initialize column and row headers amp; add grid data
func spreadsheetView(_ spreadsheetView: SpreadsheetView, cellForItemAt indexPath: IndexPath) -> Cell? {
    let cell = spreadsheetView.dequeueReusableCell(withReuseIdentifier: CellStyle.identifier, for: indexPath) as! CellStyle
    cell.printable(with: "0")
    cell.backgroundColor = .white
    if case 0 = indexPath.row {
        cell.printable(with: columnHeaders[indexPath.section])
        return cell
    } else if case 0 = indexPath.section {
        cell.printable(with: rowHeaders[indexPath.row])
        return cell
// Spreadsheet setup
func numberOfColumns(in spreadsheetView: SpreadsheetView) -> Int {
    columnHeaders.count }
func numberOfRows(in spreadsheetView: SpreadsheetView) -> Int {
    rowHeaders.count }
func spreadsheetView(_ spreadsheetView: SpreadsheetView, widthForColumn column: Int) -> CGFloat {
    if case 0 = column {
        return 90
    } else {
        return 60
    }
}
func spreadsheetView(_ spreadsheetView: SpreadsheetView, heightForRow row: Int) -> CGFloat {
    18  }
func frozenColumns(in spreadsheetView: SpreadsheetView) -> Int {
    1   }
func frozenRows(in spreadsheetView: SpreadsheetView) -> Int {
    1   }
  

РЕДАКТИРОВАТЬ: это также не работает:

 UIGraphicsBeginImageContextWithOptions(spreadsheetView.contentSize, false, UIScreen.main.scale)

    for section in 0..<spreadsheetView.numberOfColumns {
        for row in 0..<spreadsheetView.numberOfRows {
            let indexPath = IndexPath(row: row, section: section)
            guard let cell = spreadsheetView.cellForItem(at: indexPath) else { continue }
            cell.contentView.drawHierarchy(in: cell.frame, afterScreenUpdates: true)
        }
    }
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
  

Ответ №1:

Поскольку UITableView отображаются только видимые ячейки, вы могли бы попробовать создать новое табличное представление с тем же фреймом, что и его содержимое, чтобы все ячейки были видны, но я не уверен, насколько это повлияет на производительность. Также вы могли бы создать свою собственную «электронную таблицу» в UIView и сделать снимок этого.

Комментарии:

1. Я думаю, что это выше моего уровня знаний:(