2016-06-25 82 views
0

我有一個滾動視圖,我需要該滾動視圖的完整內容的屏幕截圖,我搜索並嘗試了很多解決方案,但只提供了viewcontroller總高度的屏幕截圖。 例如,如果scrollview的高度是1096而Viewcontroller的高度是532,它會根據Viewcontroller的高度截圖內容 我發現只有這個代碼對於stackoverflow很有用,並且它返回了scrollview的完整高度,但它清除了內容Viewcontroller中的滾動視圖。任何幫助如何保留scrollview的內容或任何更好的解決方案,以迅速採取一個完整的截圖。三江源滾動視圖的內容在屏幕截圖時清除

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 
} 

回答

1

使用this在我的指引,我認爲你可以使用快照的任何觀點:

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 
} 

這將簡單地調整我們的滾動視圖的邊界到它的內容大小。

我不知道這個代碼是如何執行的,但是這對於我來說是一個快速的操場。例如,運行此代碼:

let scrollView = UIScrollView(frame:CGRect(x: 0.0, y: 0.0, width: 200.0, height: 200.0)) 
scrollView.backgroundColor = UIColor.whiteColor() 
scrollView.contentSize = CGSize(width: 600.0, height: 600.0) 
let blueView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 200.0, height: 200.0)) 
blueView.backgroundColor = UIColor.blueColor() 

let redView = UIView(frame: CGRect(x: 200.0, y: 200.0, width: 400.0, height: 600.0)) 
redView.backgroundColor = UIColor.redColor() 
scrollView.addSubview(blueView) 
scrollView.addSubview(redView) 
let image = snapShotScrollView(scrollView) 

結果 enter image description here 其中作爲調用本身snapShot只返回一個藍色方形。快照之後,滾動視圖與原始內容是原始大小。

+0

謝謝你的努力。 – fmas

+0

That works .. :) – fmas

+0

爲scrollview擴展bounds.size對我來說是最好的。 – Senry