如何在iOS 13中获取scrollview的完整快照?

时间:2020-07-08 06:22:53

标签: swift uiscrollview ios13 snapshot

注意:iOS 13

对于以下代码:

extension UIScrollView {

    var snapshot: UIImage? {
        UIGraphicsBeginImageContextWithOptions(contentSize, false, 0)
        defer {
            UIGraphicsEndImageContext()
        }
        guard let context = UIGraphicsGetCurrentContext() else { return nil }
        let previousFrame = frame
        let previousOffset = contentOffset
        frame = CGRect(x: 0, y: 0, width: contentSize.width, height: contentSize.height)
        contentOffset = CGPoint.zero
        layer.render(in: context)
        frame = previousFrame
        contentOffset = previousOffset
        return UIGraphicsGetImageFromCurrentImageContext()
    }

}

它在iOS 12中确实可以完美运行,但是,在iOS 13中只有(可见区域)scrollView的快照部分。

我想对全部scrollView进行快照。有什么解决方法吗?

1 个答案:

答案 0 :(得分:0)

解决问题的关键是首先 removeFromSuperview

private func snapshot() -> UIImage? {
    
    // remove first
    scrollView.removeFromSuperview()
    
    UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, false, 0)
    
    let savedContentOffset = scrollView.contentOffset
    let savedFrame = scrollView.frame
    
    scrollView.contentOffset = CGPoint.zero
    scrollView.frame = CGRect(x: 0, y: 0, width: scrollView.contentSize.width, height: scrollView.contentSize.height)
    
    scrollView.layer.render(in: UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    
    scrollView.contentOffset = savedContentOffset
    scrollView.frame = savedFrame
    
    UIGraphicsEndImageContext()
    
    // add again
    self.view.addSubview(scrollView)
    
    scrollView.snp.remakeConstraints { (make) in
        make.left.right.equalToSuperview()
        make.top.equalTo(naviHeight)
        make.bottom.equalTo(-safeBottomHeight-105)
    }
    
    return image
}

有趣...