【问题标题】:Getting a full screenshot of a UIScrollView in iOS 13在 iOS 13 中获取 UIScrollView 的完整屏幕截图
【发布时间】:2020-03-20 13:48:47
【问题描述】:

我正在使用 Swift 5iOS 13。我正在尝试截取整个滚动视图图像并打印它,但底部显示为白色。我怎么解决这个问题?我在下图中展示并解释了所有内容。

我也查了this topic

我的扩展代码是这样的:

extension UIScrollView {

    func screenshot() -> UIImage {

        let savedContentOffset = contentOffset
        let savedFrame = frame

        UIGraphicsBeginImageContextWithOptions(contentSize, false, 0)

        contentOffset = .zero
        frame = CGRect(x: 0, y: 0, width: contentSize.width, height: contentSize.height)
        layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        contentOffset = savedContentOffset
        frame = savedFrame

        return image ?? UIImage()

    }

}

【问题讨论】:

  • 再次检查您链接的主题 - 它回答了如何解决 iOS 13 的问题 - 使用键控存档器克隆滚动视图或将其从父级中删除。为什么会发生 - 我相信是由于自动布局和现有的限制。
  • 您使用的是表格视图还是集合视图?它们都是滚动视图的子类。并且它们都旨在不绘制屏幕上不可见的内容。
  • @MaticOblak 是的,我的 scrollView 中有 collectionView。
  • @Mikhail 我看了一下,在 Swift 中找不到答案。你能写出解决方案吗?

标签: ios swift iphone scrollview core-graphics


【解决方案1】:

这是对我有用的代码 sn-p。

extension UIView {
    
    func snapshot(scrollView: UIScrollView) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, false, UIScreen.main.scale)
        layer.render(in: UIGraphicsGetCurrentContext()!)
        let savedContentOffset = scrollView.contentOffset
        let savedFrame = frame
        
        scrollView.contentOffset = CGPoint.zero
        frame = CGRect(x: 0, y: 0, width: scrollView.contentSize.width, height: scrollView.contentSize.height)
        
        layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        
        scrollView.contentOffset = savedContentOffset
        frame = savedFrame
        
        UIGraphicsEndImageContext()
        
        return image
    }
}

当你调用它时:

view.snapshot(scrollView: scrollView)

【讨论】:

  • 是的,行得通:)
【解决方案2】:

这似乎是 iOS 13 的错误,但我在 this 答案中找到了解决方案。

解决方案是我从超级视图中删除滚动视图,然后在截取屏幕截图后添加其旧约束。是的,这很愚蠢,但它就是这样工作的:(

scrollView.removeFromSuperview()
let print = scrollView.screenshot()
mainView.addSubview(scrollView)
scrollView.snp.makeConstraints { (make) in
    make.top.equalTo(topView.snp.bottom)
    make.left.bottom.right.equalToSuperview()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2021-05-10
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多