如何制作Scrollview所有内容的屏幕截图?

时间:2017-01-29 11:31:02

标签: ios swift uiscrollview swift3 screenshot

我想创建一个UIScrollView的屏幕截图,其中应包含滚动视图的全部内容,甚至包含当前用户不可见的内容。为此,我尝试了以下两种方法:

func snapShot(view:UIView) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, true, 0);

    view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true);

    let image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;
}

func snapShotScrollView(scrollView:UIScrollView) -> UIImage {
    let bounds = scrollView.bounds;

    scrollView.bounds.size = scrollView.contentSize;

    let image = snapShot(scrollView);

    scrollView.bounds = bounds;

    return image;
}

但是生成的图像仍然只显示滚动视图中当前对用户可见的那些视图元素。但我希望看到所有观点。

我该怎么做?

编辑

我也尝试过:

func snapshot() -> UIImage? {
    var image: UIImage?

    UIGraphicsBeginImageContext(scrollView.contentSize)

    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()!)
    image = UIGraphicsGetImageFromCurrentImageContext();

    scrollView.contentOffset = savedContentOffset;
    scrollView.frame = savedFrame;

    UIGraphicsEndImageContext();

    return image
}

修改2

我的UIScrollView位于UIView内,并且包含UIStackView。 View被设计为一个弹出窗口视图,因此它看起来像是一个弹出对话框。我第一次修改的代码示例工作在空白UIViewController只有一个UIScrollView,但在提到的星座中没有。

1 个答案:

答案 0 :(得分:12)

this answer到Swift,添加一个测试ViewController:

class ScreenShotTestViewController: UIViewController {

    var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()
        scrollView = UIScrollView(frame: CGRect(origin: CGPoint.zero, size: view.frame.size))
        scrollView.contentSize = CGSize(width: view.frame.size.width, height: view.frame.size.height * 2)
        scrollView.backgroundColor = UIColor.yellow
        view.addSubview(scrollView)

        let label = UILabel(frame: CGRect(x: 0.0, y: view.frame.size.height * 1.5, width: view.frame.size.width, height: 44.0))
        label.text = "Hello World!"
        scrollView.addSubview(label)

        let screenShot = snapshot()
    }

    func snapshot() -> UIImage?
    {      
        UIGraphicsBeginImageContext(scrollView.contentSize)

        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()

        return image
    }
}

生成完整内容的图片,包括子视图: