獲取UIScrollView的屏幕截圖,包括屏幕外部分我有一個UIScrollViewDeendent,它實現了如下所示的獲取Screenshot方法:-(void)takeScreenshot {
CGRect contextRect = CGRectMake(0, 0, 768, 1004);
UIGraphicsBeginImageContext(contextRect.size);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// do something with the viewImage here.}這基本上移動到滾動視圖的頂部,并獲取可見區域的屏幕截圖。當iPad是面向人像的時候,它工作得很好,但是當它在風景中的時候,圖像的底部被切斷了(因為可見區域的高度只有748,而不是1004)。是否可以獲得UIScrollView包括沒有出現在屏幕上的區域?還是我需要向下滾動,拍第二張照片,把它們縫在一起?
3 回答

慕工程0101907
TA貢獻1887條經驗 獲得超5個贊
我必須在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}

慕姐8265434
TA貢獻1813條經驗 獲得超2個贊
extension UIView { func screenshot() -> UIImage { if(self is UIScrollView) { let scrollView = self as! UIScrollView let savedContentOffset = scrollView.contentOffset let savedFrame = scrollView.frame UIGraphicsBeginImageContext(scrollView.contentSize) scrollView.contentOffset = .zero self.frame = CGRect(x: 0, y: 0, width: scrollView.contentSize.width, height: scrollView.contentSize.height) self.layer.render(in: UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext(); scrollView.contentOffset = savedContentOffset scrollView.frame = savedFrame return image! } UIGraphicsBeginImageContext(self.bounds.size) self.layer.render(in: UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image! }}
- 3 回答
- 0 關注
- 1504 瀏覽
添加回答
舉報
0/150
提交
取消