獲取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
提交
取消
