如何在 iOS 13 中获取滚动视图的完整快照?

Posted

技术标签:

【中文标题】如何在 iOS 13 中获取滚动视图的完整快照?【英文标题】:How to get entire snapshot of scrollview in iOS 13? 【发布时间】:2020-07-08 06:22:53 【问题描述】:

注意: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。有什么办法解决吗?

【问题讨论】:

几个小时前您已经发布了几乎相同的主题,不是吗?你为什么要反复这样做? @ElTomato 我已经删除了那个帖子,不是很清楚。我没有找到解决这个问题的方法,所以我需要一些帮助。 我认为这是不可能的。您可能需要手动创建一个UIView 对象并自己添加更小的对象。 请检查这个***.com/questions/41920416/… 这能回答你的问题吗? How to make a screenshot of all the content of a Scrollview? 【参考方案1】:

解决问题的关键是先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

有趣...

【讨论】:

以上是关于如何在 iOS 13 中获取滚动视图的完整快照?的主要内容,如果未能解决你的问题,请参考以下文章

如何在UIScrollView上进行UIButton修复?

如何在 iOS 中获取多个滚动视图的索引

在钛中如何截取完整的滚动视图?

在iOS中从左到右滚动时如何在Web视图中获取滚动方向?

iOS 嵌套 UIScrollViews 使用 AutoLayout

如果要求是 Textview 应该显示最多 4 行的完整文本,那么如何设置 textview 的高度,然后它应该在 swift 3 中滚动?