2017-08-26 44 views
0

我試圖在外部屏幕上的iPad上查看視圖中發生的情況。滾動時將UIScrollView捕獲到UIImage中

func startMirroring() { 
    Timer.scheduledTimer(timeInterval:0.05, target: self, selector: #selector(tick), userInfo: nil, repeats: true) 
} 

func tick() { 
    let snapshot = someView.snapshotImage() 
    placeSomewhereElse(image: snapshot) 
} 

extension UIView { 
    func snapshotImage() -> UIImage? { 
     UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0) 
     drawHierarchy(in: bounds, afterScreenUpdates: false) 
     let snapshotImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return snapshotImage 
    } 
} 

問題

滾動的滾動視圖只會體現在快照滾動結束後。我相信在滾動效率期間,scrollview並不真正更新視圖層次和佈局。然而,我需要在滾動過程中捕獲它。

我想:

  • afterScreenUpdates:真

在scrollViewDidScroll:

  • setNeedsDisplay()
  • layoutIfNeeded()
  • setNeedsLayout()

在滾動期間是否可以捕獲滾動視圖?

編輯澄清:

層次:

  • 的UIWindow < - 我想快照此
  • ---- UIView的
  • -------- UIScrollView的< - 我不知道這個

回答

2

請刪除計時器並調用sc中的startMirroring()方法rollViewDidScroll,我已經試過您的方案,並得到了滾動型的連續監測,

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    print("scrolling") 
    startMirroring() 
} 

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    print("scrolling ends") 
} 

func startMirroring() { 
    imgView.image = scrollView.snapshotImage() 
} 

extension UIView { 
    func snapshotImage() -> UIImage? { 
     UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0) 
     drawHierarchy(in: bounds, afterScreenUpdates: false) 
     let snapshotImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return snapshotImage 
    } 
} 

希望這將有助於

+0

我想捕獲整個認爲,「可能」含有scrollviews而不僅僅是特定scrollviews。我可以用它來處理視圖層次結構中的滾動視圖,因此這已經很棒了,但理想情況下,我想在沒有關於視圖層次結構的任何知識的情況下執行此操作。 – matteok

+0

請保留任何View在scrollView.snapshotImage()(例如:someView.snapshotImage())的位置,它對我來說工作得很好。 –

+0

我編輯了我的帖子以顯示潛在的視圖層次 – matteok