2017-08-26 46 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