給屏幕外的UITableViewCell截屏

給UITableViewCell截屏是一個比較普通的需求,代碼如下:

   func takeScreenshot(cell: UITableViewCell) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(cell.bounds.size, true, UIScreen.main.scale)
        cell.drawHierarchy(in: cell.bounds, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()
        UIGraphicsEndImageContext()
        return image
    }

但是,如果傳入的cell不在屏幕中時,截圖會失敗。解決方案是:

  1. 記錄下當(dāng)前UITableView的contentOffset
  2. 手動計算出目標(biāo)cell的IndexPath。這里要注意,不能使用tableView.indexPath(for: cell)。因為目標(biāo)cell在屏幕外,此函數(shù)會返回nil。
  3. 利用該IndexPath將目標(biāo)cell移動到屏幕中
  4. 調(diào)用takeScreenshot函數(shù)截屏
  5. 根據(jù)記錄下的contentOffset,再將UITableView移動回原來的位置

代碼如下:

   func screenshot(cell: UITableViewCell) -> UIImage {  
        // model.indexPathFor(cell:) 是從本地數(shù)據(jù)中算出目標(biāo)cell的IndexPath的方法
        guard let indexPath = model.indexPathFor(cell: UITableViewCell) else {
            return UIImage()
        } 

        let currentOffset = tableView.contentOffset
        tableView.scrollToRow(at: indexPath, at: .top, animated: false)
        let image = takeScreenShot(cell: cell)
        tableView.setContentOffset(currentOffset, animated: false)
        
        return image
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,621評論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,194評論 8 265
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,172評論 3 119
  • 住在樓上的爺爺又生了幾次病,身體越來越不好,兒女給他請了保姆,可是不久他就把人給辭掉了。后來我媽碰見來給他送...
    蔥花炒鐵蛋閱讀 1,920評論 0 1
  • 2017年6月25日星期日,晴。王坤(92) 今天上午最后一拍兒是打通能量結(jié)的體驗,我最喜歡這個環(huán)節(jié)了,記...
    王兆雙閱讀 378評論 0 4

友情鏈接更多精彩內(nèi)容