如何在大于屏幕时捕获整个视图内容的图像

时间:2018-01-07 22:32:35

标签: swift screenshot

我需要我的应用程序来渲染视图控制器可能显示的所有内容(包括屏幕外内容),除了顶部和底部导航栏。

下面的第一个图像显示了运行时的视图控制器。操作菜单会触发以下代码,该代码将根据给定的here答案中的代码示例进行调整:

@IBAction func actionMenu(_ sender: Any) {

    let activityItems = [generateImageOfTableView(tblview: tourneyEntrants)]
    let activityController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)

    activityController.popoverPresentationController?.sourceView = self.view
    activityController.popoverPresentationController?.sourceRect = self.view.frame

    self.present(activityController, animated: true, completion: nil)
}

func generateImageOfTableView(tblview: UITableView) -> UIImage {

    var image = UIImage()

    UIGraphicsBeginImageContextWithOptions(tblview.contentSize, false, UIScreen.main.scale)

    // save initial values
    let savedContentOffset = tblview.contentOffset;
    let savedFrame = tblview.frame;
    let savedBackgroundColor = tblview.backgroundColor

    // reset offset to top left point
    tblview.contentOffset = CGPoint(x: 0, y: 0);
    // set frame to content size
    tblview.frame = CGRect(x: 0, y: 0, width: tblview.contentSize.width, height: tblview.contentSize.height);
    // remove background
    tblview.backgroundColor = UIColor.clear

    // make temp view with scroll view content size
    // a workaround for issue when image on ipad was drawn incorrectly
    let tempView = UIView(frame: CGRect(x: 0, y: 0, width: tblview.contentSize.width, height: tblview.contentSize.height))

    // save superview
    let tempSuperView = tblview.superview
    // remove scrollView from old superview
    tblview.removeFromSuperview()
    // and add to tempView
    tempView.addSubview(tblview)

    // render view
    // drawViewHierarchyInRect not working correctly
    tempView.layer.render(in: UIGraphicsGetCurrentContext()!)
    // and get image
    image = UIGraphicsGetImageFromCurrentImageContext()!

    // and return everything back
    tempView.subviews[0].removeFromSuperview()
    tempSuperView?.addSubview(tblview)

    // restore saved settings
    tblview.contentOffset = savedContentOffset;
    tblview.frame = savedFrame;
    tblview.backgroundColor = savedBackgroundColor

    UIGraphicsEndImageContext()

    return image
}

下面的第二张图片显示了从此代码中捕获的图像。

它有两个问题。

首先是它忽略了表格上方的文本字段和标签。我知道代码不会查找,所以我正在寻找有关如何捕获superview内容的一些指导(减去导航栏)。

其次,表格视图包含18列数字,但未捕获这些数字。因此,代码应对表格的高度超出屏幕而不是宽度。我看过自动布局是否可能导致这种情况,但看不出任何明显的东西。

Rendered capture from screen View controller at run-time

0 个答案:

没有答案