我必须在iOS 8和更高版本上实现这一点,并在iPhone上进行测试。接受的答案只是呈现滚动视图的可见部分,而图像的其余部分仍然是空白的。
我试着用drawViewHierarchyInRect-运气不好取决于afterScreenUpdates赋存true或false我被拉伸了一部分图像或者只是部分内容。
实现正确的快照的唯一方法是UIScrollView其全部内容是将其添加到另一个临时视图中,然后呈现它。
示例代码如下(scrollview是我的VC中的插座)func getImageOfScrollView() -> UIImage {
var image = UIImage()
UIGraphicsBeginImageContextWithOptions(self.scrollView.contentSize, false, UIScreen.mainScreen().scale)
// save initial values
let savedContentOffset = self.scrollView.contentOffset let savedFrame = self.scrollView.frame let savedBackgroundColor = self.scrollView.backgroundColor // reset offset to top left point
self.scrollView.contentOffset = CGPointZero
// set frame to content size
self.scrollView.frame = CGRectMake(0, 0, self.scrollView.contentSize.width, self.scrollView.contentSize.height)
// remove background
self.scrollView.backgroundColor = UIColor.clearColor()
// make temp view with scroll view content size
// a workaround for issue when image on ipad was drawn incorrectly
let tempView = UIView(frame: CGRectMake(0, 0, self.scrollView.contentSize.width, self.scrollView.contentSize.height))
// save superview
let tempSuperView = self.scrollView.superview // remove scrollView from old superview
self.scrollView.removeFromSuperview()
// and add to tempView
tempView.addSubview(self.scrollView)
// render view
// drawViewHierarchyInRect not working correctly
tempView.layer.renderInContext(UIGraphicsGetCurrentContext())
// and get image
image = UIGraphicsGetImageFromCurrentImageContext()
// and return everything back
tempView.subviews[0].removeFromSuperview()
tempSuperView?.addSubview(self.scrollView)
// restore saved settings
self.scrollView.contentOffset = savedContentOffset self.scrollView.frame = savedFrame self.scrollView.backgroundColor = savedBackgroundColor UIGraphicsEndImageContext()
return image}